MySQL如何实现首查询无结果时执行次查询并返回单一结果?
条件查询结果异常修复
需求说明
当第一个查询无结果时执行第二个查询,具体逻辑:
- 优先查询
students表中age>20的id(按id降序取1条) - 若上述查询无结果,则查询
age<20的id数量
现有表数据
id name gender age 1 'Ryan' 'M' 30 2 'Joanna' 'F' 10
原查询语句
(SELECT id FROM students WHERE age > 20 ORDER BY id desc limit 1) UNION ALL SELECT count(id) FROM students WHERE age < 20 AND NOT EXISTS (SELECT * FROM students WHERE age > 20 ORDER BY id desc limit 1)
问题现象
- 当前执行结果返回两行:
1和0,但期望仅返回1 - 当将Ryan的
age改为10时,返回2,此结果符合预期
问题原因
原语句使用UNION ALL会强制合并两个查询的结果集:
- 第一个查询命中数据时,会返回
1 - 第二个查询中,即使
NOT EXISTS条件不成立(因为第一个查询有结果),COUNT(id)在无匹配行时仍会返回0,导致结果多了一行无效数据
修复后的查询语句
SELECT COALESCE( (SELECT id FROM students WHERE age > 20 ORDER BY id DESC LIMIT 1), (SELECT COUNT(id) FROM students WHERE age < 20) ) AS result;
逻辑说明
COALESCE函数会依次返回第一个非NULL的结果- 当第一个子查询(
age>20的id)有结果时,直接返回该值 - 当第一个子查询无结果(返回
NULL),则执行第二个子查询返回age<20的id数量
内容的提问来源于stack exchange,提问作者Premlatha
相关产品推荐
相关产品推荐

