首页 > 解决方案 > 包含不匹配记录的联接

问题描述

我有一个标签列表。我想列出所有标签和每个标签使用的总数。

我可以使用 LEFT JOIN 获得结果。我的问题是我的声明不包含未使用的标签。如果可能的话,我还想显示所有标签(在一个 SQL 语句中使用和未使用)。

SQL 语句:

SELECT tag.name, COUNT(tag.id)
FROM tags
LEFT JOIN posts ON posts.tagid = tags.id
WHERE posts.published = 'yes'
GROUP BY posts.tagid

标签: sql

解决方案


WHERE条件移至ON子句:

SELECT t.name, COUNT(p.tagid)
FROM tags t LEFT JOIN
     posts p
     ON p.tagid = t.id AND p.published = 'yes'
GROUP BY t.name, t.tagid;

一般规则是:对于第一个LEFT JOIN上的过滤器,进入子句。第二个表上的过滤器放在子句中。否则,该子句将外连接变为内连接。WHEREONWHERE

笔记:

  • 现在COUNT()计算第二个表中的匹配项,因此它可以返回0值。
  • 未聚合的SELECT列与GROUP BY.
  • 我添加了表别名,因此查询更易于编写和阅读。

推荐阅读