MySQL合并查询结果异常:需合并两个查询的统计总和
解决MySQL合并计数查询返回空的问题
我懂你的问题了——当子查询找不到匹配finish_pos = '1'的数据时,连主查询的结果都跟着丢了,没法得到两个计数的总和。问题根源在原查询的结构上:它依赖主查询ic_dd_old_data返回至少一行数据,才能执行后续的加法计算。如果主查询本身没有符合horse_mraid = '123123' AND pl='1'的记录,整个结果集就会为空,哪怕你给子查询加了IFNULL也没用。
最简洁的修正方案:独立计算两个计数再相加
把两个统计操作拆成独立的子查询直接相加,这样不管哪部分有没有匹配数据,都会返回对应的数值(COUNT函数本身就会返回0而不是NULL,甚至不需要额外的IFNULL处理):
SELECT -- 统计旧数据中符合条件的获胜次数 (SELECT COUNT(id) FROM ic_dd_old_data WHERE horse_mraid = '123123' AND pl='1') + -- 统计结果表中符合条件的获胜次数 (SELECT COUNT(id) FROM ic_dd_results WHERE horse_id = '123123' AND finish_pos = '1') AS count_win;
为什么这个方案能解决问题?
每个子查询都是独立执行的:
- 如果某张表没有匹配数据,对应的
COUNT会返回0 - 两个数值直接相加,最终一定会返回一行结果,哪怕总和是0
保留原结构的改进版(可选)
如果你更倾向于原查询的写法,也可以用COALESCE确保主查询部分即使无数据也返回0,同时补充一个分支处理主查询为空的情况:
SELECT COALESCE(COUNT(od.id), 0) + COALESCE((SELECT COUNT(rmrs.id) FROM ic_dd_results rmrs WHERE rmrs.horse_id = '123123' AND rmrs.finish_pos = '1'), 0) AS count_win FROM ic_dd_old_data od WHERE od.horse_mraid = '123123' AND od.pl='1' -- 主查询无数据时,单独计算子查询的结果 UNION ALL SELECT 0 + COALESCE((SELECT COUNT(rmrs.id) FROM ic_dd_results rmrs WHERE rmrs.horse_id = '123123' AND rmrs.finish_pos = '1'), 0) WHERE NOT EXISTS (SELECT 1 FROM ic_dd_old_data od WHERE od.horse_mraid = '123123' AND od.pl='1');
不过第一种方案更简洁高效,优先推荐使用。
内容的提问来源于stack exchange,提问作者GTS85
相关产品推荐
相关产品推荐

