MYSQL返回具有相关帖子计数的所有类别

MYSQL返回具有相关帖子计数的所有类别,mysql,Mysql,我试图返回所有类别以及与之相关的任何相关/标记的帖子的数量 下面是表结构的一个示例 员额表 标签表 支柱标记轴 下面是查询的分类 获取所有标签 这将返回我所有的标签 获取具有Post计数的所有标记 这将仅在找到结果/发布位置时返回标记。我希望返回所有标记,即使计数为0,并且该特定标记的计数显示为0。有没有一种方法可以这样构造查询?我尝试过左外部联接,但仍然得到相同的结果。因为您希望考虑所有标记,所以您的基表应该是tags table,而左联接应该从那里开始。始终考虑来自最左侧表的所有数据,并仅联

我试图返回所有类别以及与之相关的任何相关/标记的帖子的数量

下面是表结构的一个示例

员额表

标签表

支柱标记轴

下面是查询的分类

获取所有标签

这将返回我所有的标签

获取具有Post计数的所有标记


这将仅在找到结果/发布位置时返回标记。我希望返回所有标记,即使计数为0,并且该特定标记的计数显示为0。有没有一种方法可以这样构造查询?我尝试过左外部联接,但仍然得到相同的结果。

因为您希望考虑所有标记,所以您的基表应该是tags table,而左联接应该从那里开始。始终考虑来自最左侧表的所有数据,并仅联接来自右侧表且与联接条件匹配的数据。因此,所有标记都会被考虑,因为它是最左边的表,但是只考虑那些在透视表中的帖子。请尝试以下操作:

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的评论进行编辑,只考虑那些用户id=1的帖子。为了实现这一点,我们在posts表的LEFT JOIN中添加了额外的AND要求。以下是更新后的查询:

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

首先使用“左表名称”将要包含的表值与计数值一起使用,对于示例数据,可以从左表开始使用标记\透视或标记

 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

从tags表开始,然后左键连接到tags\u pivot,最后发布p.parent\u id和表产品在上述代码段中丢失。您能更新最终的查询吗?查询成功,但如果我在其中添加where子句,它只返回少数类别,而不是所有类别的计数都显示为0。@Miura shi您在where子句中添加了什么?你可以用IF来解决这个问题。请解释一下,我可以编辑并提供一个插件查询。我在我的第一篇文章中将额外的字段作为示例添加到posts表中。例如,子句应该是p.user_id=1。@Miura shi我添加了一个edit。基本上,您可以在“与posts的左联接”表中添加一个新的AND条件。@Miura shi left join始终考虑来自最左侧表的所有数据,并仅联接来自与联接条件匹配的右侧表的数据。因此,所有标记都会被考虑,因为它是最左边的表,但是只考虑那些位于透视中且用户id为1的帖子。希望这有意义?
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
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
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
 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