MySQL查询两次返回同一行

阿克谢里(Akshay Shrivastav)

我正在尝试使用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,因此,我也想获得该子类别名称。

我在具有postsID表中有两行,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给定的匹配项postpost则不会出现在结果中

根据您的用例,您需要:

  • 请勿这样做JOIN subcategory,以避免重复posts
  • LEFT JOIN subcategory而不是INNER JOIN subcategory避免postssubcategory被过滤掉

如果给定帖子确实有多个子类别,而您仍想在结果中显示一行,则可以使用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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章