Определяемая пользователем переменная Mysql не обновляется при 0

для проекта анализа данных мне нужно разбить таблицу относительно датированных расписаний сотрудников в следующем формате:

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

Для двух столбцов я использую пользовательскую переменную @cur_Count в операторе CASE.

...
(
    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 сбрасывается до 1 в предложении ELSE) первая запись для сотрудника начинается с 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 ответ

  1. Переключить порядок 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,