mysql返回具有相关post count的所有类别

6fe3ivhb  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(416)

我试图返回所有类别和任何相关/标签与他们相关的职位计数。
下面是一个表结构的示例。
posts表

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

这会返回我所有的标签
获取所有带有post count的标签

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为特定的标签。有没有这样的方法来构造查询?我尝试了左外连接,但仍然得到相同的结果。

z4bn682m

z4bn682m1#

因为您想要考虑所有的标记,所以您的基表应该是 tags table和你的 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 JOINposts 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 AND p.user_id = 1
GROUP BY
    t.tag_name
z18hc3ub

z18hc3ub2#

首先使用left table name要包含哪些表值和计数值,对于示例数据,可以从left table开始使用tags\u pivot或tags

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

相关问题