MySQL查询两次返回同一行

时间:2018-12-22 19:31:43

标签: mysql sql inner-join

我正在尝试使用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)并运行查询,则该查询运行完美,所有行均正确显示。

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

1 个答案:

答案 0 :(得分:2)

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合并为一个字段:< / p>

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