首页 >数据库 >mysql教程 >为什么我的 LEFT JOIN 在 PostgreSQL 中不返回零计数?

为什么我的 LEFT JOIN 在 PostgreSQL 中不返回零计数?

DDD
DDD原创
2025-01-14 10:57:44904浏览

Why Doesn't My LEFT JOIN Return Zero Counts in PostgreSQL?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn