MySQL如何用最后一行值统计出现次数?变量语法查询异常求助
问题排查与修正方案
我来帮你拆解下为啥count值一直没变化的问题,你的查询里有几个关键的小疏漏:
1. 核心变量未初始化
你在if()判断里用到了@lastShiftCode,但这个变量完全没被初始化过!MySQL里未赋值的变量默认是NULL,而NULL和任何值做相等判断结果都是NULL(会被视为false),所以每次都会执行@count:=0,count自然一直是0。
2. 跟踪的变量和判断字段不匹配
你声明了@lastCode来存ts.code,但实际判断的是ts.shift_code和@lastShiftCode——这俩变量根本不相关,等于你完全没在跟踪上一行的shift_code值,逻辑链断了。
3. ORDER BY的执行时机搞反了
MySQL里SELECT子句的计算是在ORDER BY之前的!你现在的逻辑是先算变量值,再对结果排序,这会导致变量计算用的是未排序的原始数据,顺序完全混乱,统计逻辑自然失效。
修正后的查询语句
我们需要先把数据排好序,再初始化变量逐行计算,用子查询就能解决这个问题:
SELECT ts.id, ts.date, ts.code, ts.shift_code, -- 先判断当前shift_code是否和上一个相等,更新count IF(@lastShiftCode = ts.shift_code, @count := @count + 1, @count := 0) AS occurences, @lastShiftCode := ts.shift_code AS last_shift_code -- 最后更新跟踪变量,给下一行用 FROM ( -- 先按id和date排序,确保数据顺序符合你的统计逻辑 SELECT id, date, code, shift_code FROM empCodes WHERE date BETWEEN '2018-01-01' AND '2018-02-01' ORDER BY id, date ) ts, -- 初始化变量:count从0开始,lastShiftCode设为一个不会干扰判断的初始值 (SELECT @count := 0, @lastShiftCode := '') AS init_vars;
关键修正点说明
- 变量初始化:通过
(SELECT @count := 0, @lastShiftCode := '') AS init_vars在查询启动时就给变量赋值,彻底避免NULL的坑。 - 先排序再计算:用子查询提前完成数据排序,保证我们是按你想要的
id+date顺序逐行处理。 - 变量更新顺序:先计算
occurences,再更新@lastShiftCode,这样下一行判断时用的就是当前行的shift_code值,逻辑完全通顺。
这样修改后,就能正确统计连续相同shift_code的出现次数了。
内容的提问来源于stack exchange,提问作者SK2017
相关产品推荐
相关产品推荐

