MYSQL返回所有具有相关职位数的类别

时间:2018-09-05 18:02:25

标签: mysql

我正在尝试返回所有类别以及与之相关的所有相关/已标记帖子的计数。

这是表结构的示例。

帖子表

id      name    user_id
1       post 1  1
2       post 2  2
3       post 3  1

标签表

id      tag_name
1       Category 1
2       Category 2
3       Category 3

帖子标签透视

id      tag_id  post_id
1       3       2
2       3       2
3       1       3

这是查询的细分

获取所有标签

SELECT t.tag_name
FROM tags t
GROUP BY
    t.tag_name

这将返回我所有的标签

获取所有带有发布计数的标签

SELECT t.tag_name, count(p.id) as count FROM products p
LEFT JOIN tags_pivot c ON p.id = c.post_id
LEFT JOIN tags t ON t.id = c.tag_id
WHERE p.user_id = 1
GROUP BY
    t.tag_name

这仅在结果/发布的地方返回标签。我想返回所有标签,即使计数为0,并且该特定标签的计数显示为0。有没有办法像这样构造查询?我曾经尝试过使用左外部联接,但仍然保持相同的结果。

2 个答案:

答案 0 :(得分:1)

由于要考虑所有标记,因此基表应该是tags表,而LEFT JOIN应该从此处开始。 LEFT JOIN始终考虑最左表中的所有数据,并仅对来自右表中符合联接条件的那些数据进行联接。因此,将考虑所有tags(因为它是最左侧的表),但是只考虑数据透视表中的那些posts。请尝试以下操作:

SELECT t.tag_name, COUNT(p.id) as count 
FROM tags AS t 
LEFT JOIN tags_pivot AS c ON t.id = c.tag_id 
LEFT JOIN posts AS p ON p.id = c.post_id 
GROUP BY
    t.tag_name

编辑根据OP的评论,只有那些帖子位于user_id = 1处。为此,我们在AND表的LEFT JOIN中添加了额外的posts要求。这是更新的查询:

SELECT t.tag_name, COUNT(p.id) as count 
FROM tags AS t 
LEFT JOIN tags_pivot AS c ON t.id = c.tag_id 
LEFT JOIN posts AS p ON p.id = c.post_id AND p.user_id = 1
GROUP BY
    t.tag_name

答案 1 :(得分:0)

使用左表名称1st要包含计数值的表值,对于您的示例数据,tags_pivot或tag可以从左表开始

 SELECT t.tag_name, count(p.id) as count FROM tags_pivot c 
   LEFT JOIN tags t ON t.id = c.tag_id
    LEFT JOIN products p
      ON p.parent_id = c.post_id    
    GROUP BY
        t.tag_name