分组后COUNT运算符返回NULL,如何实现无匹配记录时返回0?
解决左连接后无法显示count为0的记录问题
你的查询只返回pb_count≥1的记录,核心问题是**WHERE pb."status" = 'ready'过滤掉了所有没有匹配到符合条件充电宝的场地行**。
左连接后,没有对应充电宝的行中pb表的所有字段都是NULL,而NULL和任何值比较结果都是false,所以这些行被WHERE条件直接排除了,自然看不到pb_count为0的记录。
修正方案1:将充电宝状态过滤移到JOIN的ON条件中
把pb."status" = 'ready'从WHERE子句移到LEFT JOIN power_banks的关联条件里,这样只会关联状态为ready的充电宝,不会过滤掉没有匹配的场地行:
SELECT pl."name" as "name", COUNT(pb."id") as "pb_count" FROM charging_station_places pl LEFT OUTER JOIN charging_stations st ON st."placeId" = pl."id" LEFT OUTER JOIN power_banks pb ON pb."chargingStationId" = st."id" AND pb."status" = 'ready' WHERE pl."isHidden" IS NOT True GROUP BY pl."name" ORDER BY "pb_count" ASC
COUNT(pb."id")会自动返回0(当没有匹配的充电宝时,pb."id"为NULL,COUNT会忽略NULL值),不需要额外用COALESCE。- 仅保留场地的过滤条件
pl."isHidden" IS NOT True,确保所有未隐藏的场地都被纳入结果。
修正方案2:先统计充电站的充电宝数量,再关联场地
如果数据量较大,这种子查询的方式可能更高效,先按场地分组统计ready充电宝总数,再和场地表左连接:
SELECT pl."name" as "name", COALESCE(st.pb_count, 0) as "pb_count" FROM charging_station_places pl LEFT JOIN ( SELECT st."placeId", COUNT(pb."id") as pb_count FROM charging_stations st LEFT JOIN power_banks pb ON pb."chargingStationId" = st."id" AND pb."status" = 'ready' GROUP BY st."placeId" ) st ON st."placeId" = pl."id" WHERE pl."isHidden" IS NOT True ORDER BY "pb_count" ASC
内容的提问来源于stack exchange,提问作者OcMaRUS
相关产品推荐
相关产品推荐

