MySQL 查询返回同一行两次



我正在尝试使用 3 个表显示数据

posts
  - id
  - category_id
  - user_authors_id
  - title
  - status
user_authors
  - id
  - author_name
categories
  - id
  - name
subcategories
  - id
  - name

我想做的是。我正在创建一个将显示帖子的视图面板。所以,我使用了 3 张桌子。从user_authors我将获得作者姓名,从类别表中我将获得类别名称,现在类别表具有子类别 id,所以我也想获取子类别名称。

我在 posts 表中有两行 id 29 and 30,但是当我运行以下查询时,它显示了 2 个具有相同数据的条目。

SELECT 
   posts.id, 
   categories.name AS cat_name, 
   subcategories.name AS subcat_name, 
   posts.title, 
   user_authors.author_name, 
   posts.created, 
   posts.status
FROM posts 
INNER JOIN user_authors ON (user_authors.id = posts.user_author_id) 
INNER JOIN categories ON(posts.category_id = categories.id) 
INNER JOIN subcategories ON (categories.id = subcategories.category_id)

但是,如果我INNER JOIN subcategories ON (categories.id = subcategories.category_id)删除此语句并运行查询,它将完美运行,所有行都正确显示。

发生了什么,我不是想得到它。查询在哪里错误,也没有显示错误。

INNER JOIN subcategories ON (categories.id = subcategories.category_id)

实际上,为了使您的查询返回您期望的内容,子类别中必须有一条且只有一条记录与给定post匹配:

  • 如果多个subcategory与给定post匹配,则post行将在结果中重复
  • 如果没有subcategory与给定post匹配,则post不会出现在结果中

根据您的使用案例,您需要:

  • JOIN subcategory,以避免重复post
  • LEFT JOIN subcategory而不是INNER JOIN subcategory以避免posts,而不会过滤掉subcategory

如果给定帖子确实有多个子类别,并且仍希望在结果中显示一行,则可以使用 GROUP_CONCAT 聚合功能将subcategories连接到一个字段中:

SELECT 
   posts.id, 
   categories.name AS cat_name, 
   GROUP_CONCAT( subcategories.name, ', ') AS subcat_names, 
   posts.title, 
   user_authors.author_name, 
   posts.created, 
   posts.status
FROM posts 
INNER JOIN user_authors ON (user_authors.id = posts.user_author_id) 
INNER JOIN categories ON(posts.category_id = categories.id) 
LEFT  JOIN subcategories ON (categories.id = subcategories.category_id)
GROUP BY 
   posts.id, 
   categories.name, 
   posts.title, 
   user_authors.author_name, 
   posts.created, 
   posts.status

最新更新