mysql查询返回同一行两次

m0rkklqb  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(442)

我试图用3个表来显示数据

posts
  - id
  - category_id
  - user_authors_id
  - title
  - status

user_authors
  - id
  - author_name

categories
  - id
  - name

subcategories
  - id
  - name

我想做的是。我正在创建一个视图面板来显示文章。所以,我用了3张table。从user\u authors我将获得作者名称,从categories表我将获得类别名称,现在类别表有子类别id,所以我还想获得子类别名称。
我在教室里有两排 posts id为的表 29 and 30 但是当我运行下面的查询时,它显示了两个具有相同数据的条目。

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) 并运行查询,它运行完美,所有行都正确显示。
发生了什么事,我不是想得到它。哪里是错误的查询,也没有显示错误。

jljoyd4f

jljoyd4f1#

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

实际上,要使查询返回所需的结果,子类别中必须有且只有一条记录与给定的匹配 post :
如果不止一个 subcategory 匹配给定的 post ,的 post 行将在结果中重复
如果没有 subcategory 匹配给定的 post ,的 post 不会出现在结果中
根据您的用例,您需要:
不去 JOIN subcategory ,以避免重复 post s 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

相关问题