MySQL中实现优先查询L1_ON值的条件判断SQL语句编写求助
解决MySQL优先获取特定值记录的查询问题
嗨,我懂你的需求啦——要优先从plate表里取tp1为L1_ON的记录,要是表里压根没这个值,再取L1_OFF的记录。先说说你原来写的SQL哪里出问题了:WHERE后面多了个多余的AND,而且IF函数在WHERE子句里的用法完全不对,MySQL里不能这么写哦。
给你两种靠谱的实现方法,选哪种都行:
方法一:用CASE排序控制优先级(最直观)
这种方法通过排序把L1_ON的记录排在最前面,然后取第一条,逻辑清晰易懂:
SELECT id, dateandtime, tp1 FROM plate WHERE tp1 IN ('L1_ON', 'L1_OFF') -- 先过滤掉其他无关值,可选但推荐 ORDER BY CASE WHEN tp1 = 'L1_ON' THEN 0 ELSE 1 END ASC, -- L1_ON优先级更高,排前面 id ASC -- 同类型记录按id升序取第一条 LIMIT 1;
逻辑说明:
- 先通过
WHERE子句过滤出只有L1_ON和L1_OFF的记录(如果表中还有其他值的话,这一步很有必要) - 用
CASE表达式给L1_ON标记为0,L1_OFF标记为1,排序时0在前1在后,确保优先拿到L1_ON的记录 - 最后加
LIMIT 1只取第一条符合优先级的记录
方法二:用EXISTS判断+UNION ALL(精准控制执行逻辑)
如果你想更明确地先检查有没有L1_ON,再决定是否查L1_OFF,可以用这种写法:
-- 先尝试获取L1_ON的第一条记录 SELECT id, dateandtime, tp1 FROM plate WHERE tp1 = 'L1_ON' ORDER BY id ASC LIMIT 1 UNION ALL -- 只有当不存在L1_ON时,才执行这条获取L1_OFF的语句 SELECT id, dateandtime, tp1 FROM plate WHERE tp1 = 'L1_OFF' AND NOT EXISTS (SELECT 1 FROM plate WHERE tp1 = 'L1_ON') ORDER BY id ASC LIMIT 1;
逻辑说明:
- 第一个
SELECT会先查询L1_ON的第一条记录,如果有结果,整个语句就返回这条 - 第二个
SELECT里的NOT EXISTS会先检查表中有没有L1_ON的记录,只有当没有时,才会执行查询L1_OFF的逻辑 UNION ALL不会去重,刚好符合我们“优先取前者,没有再取后者”的需求
内容的提问来源于stack exchange,提问作者qarn.ooz
相关产品推荐
相关产品推荐

