我正在尝试返回所有类别以及与之相关的所有相关/已标记帖子的计数。
这是表结构的示例。
帖子表
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。有没有办法像这样构造查询?我曾经尝试过使用左外部联接,但仍然保持相同的结果。
答案 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