You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:35:04