左连接查询无法显示无对应外键的组织卡片数问题求助
嘿,这个问题我熟!咱们来一步步解决它。
首先,你的查询之所以只返回有活跃卡片的组织,问题出在WHERE子句里的boc.is_active = true条件。因为你用的是左连接,那些没有对应卡片的组织在bus_operator_cards表的所有字段都是NULL,而NULL = true的判断结果是不成立的,所以这些行直接被WHERE过滤掉了,自然看不到它们。
那怎么改呢?需要做两个关键调整:
把
boc.is_active = true移到左连接的ON子句中:
这样做的话,左连接只会关联那些活跃的卡片记录,而不会因为这个条件过滤掉没有卡片的组织——这些组织依然会留在结果集里,只是bus_operator_cards相关的字段都是NULL。替换
IFNULL为条件判断:COUNT(bus_operator_card_id)在没有匹配行的时候返回的是0而不是NULL,所以IFNULL根本不会触发。咱们需要用CASE语句或者IF函数来判断计数是否为0,从而显示你想要的"--"。
最后,为了符合SQL标准(避免ONLY_FULL_GROUP_BY模式下的报错),最好把organisation_name也加入到GROUP BY子句里。
修改后的完整SQL语句如下:
SELECT o.organisation_id, organisation_name, CASE WHEN COUNT(boc.bus_operator_card_id) = 0 THEN "--" ELSE COUNT(boc.bus_operator_card_id) END AS num_cards FROM `organisation` o LEFT OUTER JOIN `bus_operator_cards` boc ON o.organisation_id = boc.organisation_id AND boc.is_active = true WHERE o.org_type_id =5 GROUP BY o.organisation_id, organisation_name ORDER BY o.organisation_id DESC;
这样执行后,就能得到你期望的结果:既有带活跃卡片的组织,也有无卡片的组织(num_cards显示"--")。
内容的提问来源于stack exchange,提问作者Wells
相关产品推荐
相关产品推荐

