Mysql用户定义的变量在0时不更新

时间:2016-12-29 18:16:36

标签: mysql innodb

对于数据分析项目,我需要按以下格式拆分有关过时员工时间表的表格:

Employee|Start_Days|End_Days|...
0001|0|7|...
0001|7|14|...
0001|14|21|...
0002|0|7|...
0002|14|21|...
...  

对于这两列,我在CASE语句中使用了用户定义的变量@cur_Count。

...
(
    CASE 
        e.EMPLOYEE
    WHEN
        @cur_Employee
    THEN
        @cur_Count := @cur_Count + 1
    ELSE
        @cur_Count := 1
        AND @cur_Employee   := e.EMPLOYEE
    END
) * 7 AS START_DAYS,
(@cur_Count + 1) * 7 AS END_DAYS,
...
FROM 
    tmp_MS_Relevant_Employees AS e, 
    hlp_MS_Calendar_Weeks AS c,
    (SELECT @cur_Employee = '', @cur_Count := 0) AS init
WHERE
    ...

这个陈述非常合适 - 除了(因为@cur_Count在ELSE子句中重置为1),员工的第一个条目从第7天开始而不是0。 但是,如果我使用以下其中一个

@cur_Count := 0 
@cur_Count := @cur_Count * 0
@cur_Count := @cur_Count - @cur_Count

或以任何其他方式将变量重置为0,输出如下所示:

Employee|Start_Days|End_Days|...
0001|0|7|...
0001|0|7|...
0001|0|7|...

显然变量忽略了重置为0后更新其值的任何尝试。虽然这个问题很容易解决,但仍然令人费解(并且解决方法并不整洁)。我在这里遗漏了什么或者这是MySql的错误吗?

提前感谢您的任何反馈!

1 个答案:

答案 0 :(得分:0)

AND表达式的顺序切换为

    (@cur_Employee := e.EMPLOYEE)
    AND (@cur_Count := 0)

这是因为AND执行短路。当您指定0时,会将其视为FALSE,因此不会执行分配。

另一个选择是在乘以后减去7

(
    CASE 
        e.EMPLOYEE
    WHEN
        @cur_Employee
    THEN
        @cur_Count := @cur_Count + 1
    ELSE
        (@cur_Count := 1)
        AND (@cur_Employee   := e.EMPLOYEE)
    END
) * 7 - 7 AS START_DAYS,