sql - 包含不匹配记录的联接
问题描述
我有一个标签列表。我想列出所有标签和每个标签使用的总数。
我可以使用 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
解决方案
将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
上的过滤器,进入子句。第二个表上的过滤器放在子句中。否则,该子句将外连接变为内连接。WHERE
ON
WHERE
笔记:
- 现在
COUNT()
计算第二个表中的匹配项,因此它可以返回0
值。 - 未聚合的
SELECT
列与GROUP BY
. - 我添加了表别名,因此查询更易于编写和阅读。
推荐阅读
- c - 正确的公式,错误的程序... C 编程循环
- javascript - 修改对象数组的键和值并将其复制到另一个对象数组中
- php - Yii2 $model->save() 和验证码验证规则不起作用
- compiler-construction - 通过合适的例子理解预测解析中错误恢复(恐慌模式)的启发式
- javascript - 不和谐.js | 如何从给定的jsondata链接设置随机输出?
- python - Django 应用程序 - 从 S3 获取静态文件
- javascript - 递归地从对象中删除编号的键
- r - 如果它与向量中的项目匹配,则替换整个数据框中的所有值
- springdoc - 使用 GroupedOpenApi bean 时未在 Swagger-UI 中添加 Springdoc-openapi 全局标头
- r - 在 CVXR 中,如何使用外部 c++ 函数?