MySQL优先查询指定USER_ID行,无则取NULL行的实现问题
解决优先查询指定USER_ID记录的问题
我完全懂你的需求——你想针对adv_id = 22的记录,优先返回user_id = 3的行;如果这行不存在,再返回user_id为NULL的行,而不是把符合条件的两行都查出来。你之前的SQL用了OR条件,只要满足其中一个条件的行都会被返回,这就是为什么会得到两行结果。
下面给你两种可行的解决方案:
方案一:用排序+LIMIT实现优先级
这种方法简单直观,通过给目标行设置更高的排序优先级,然后只取第一行:
SELECT * FROM `table` WHERE adv_id = 22 AND (user_id = 3 OR user_id IS NULL) ORDER BY CASE WHEN user_id = 3 THEN 0 ELSE 1 END LIMIT 1;
原理说明:
CASE表达式会给user_id = 3的行标记为0,给user_id IS NULL的行标记为1- 排序时
0排在1前面,所以LIMIT 1会优先取到user_id = 3的行;如果这行不存在,就会返回user_id为NULL的行
方案二:用UNION ALL+NOT EXISTS做条件判断
这种方法会先尝试查询目标行,只有当目标行不存在时,才会查询user_id为NULL的行:
SELECT * FROM `table` WHERE adv_id = 22 AND user_id = 3 UNION ALL SELECT * FROM `table` WHERE adv_id = 22 AND user_id IS NULL AND NOT EXISTS (SELECT 1 FROM `table` WHERE adv_id = 22 AND user_id = 3);
原理说明:
- 第一个
SELECT会先查找adv_id=22且user_id=3的行,如果存在就直接返回结果 - 第二个
SELECT里的NOT EXISTS会判断第一个查询是否有结果,只有当第一个查询无结果时,才会执行第二个查询返回user_id为NULL的行
这两种方法都能满足你的需求,第一种写法更简洁,第二种在数据量较大时可能性能更优(取决于你的表结构和索引情况)。
内容的提问来源于stack exchange,提问作者Pavel K
相关产品推荐
相关产品推荐

