PostgreSQL LEFT JOIN:确保返回零计数
PostgreSQL LEFT JOIN
的一个常见问题是无法返回计数为零的行。 当过滤条件放置不正确时,就会出现这种情况。
考虑此查询,旨在对每个组织的考试项目进行计数,但仅返回计数大于零的组织:
<code class="language-sql">select o.name as organisation_name, coalesce(COUNT(exam_items.id)) as total_used from organisations o left join exam_items e on o.id = e.organisation_id where e.item_template_id = #{sanitize(item_template_id)} and e.used = true group by o.name order by o.name</code>
更正查询
问题出在WHERE
子句上。 此处放置的条件会过滤 连接之后,有效地删除零计数组织。解决方案是将过滤条件移至 JOIN
子句本身:
<code class="language-sql">SELECT o.name AS organisation_name, count(e.id) AS total_used FROM organisations o LEFT JOIN exam_items e ON e.organisation_id = o.id AND e.item_template_id = #{sanitize(item_template_id)} AND e.used GROUP BY o.name ORDER BY o.name;</code>
通过将过滤器集成到 JOIN
中,我们确保连接操作中仅包含匹配的行。这可以防止意外排除计数为零的组织。
重要提示:
COUNT()
的行为: 与许多聚合函数不同,COUNT()
永远不会返回 NULL
。 因此,COALESCE(COUNT(col))
是多余的。COUNT()
应用到 NOT NULL
列,或确保连接条件保证非空值。以上是为什么我的 LEFT JOIN 在 PostgreSQL 中不返回零计数?的详细内容。更多信息请关注PHP中文网其他相关文章!