eu preciso de ajuda por favor com a seguinte consulta. Estou puxando os códigos postais ( plz
) junto com o ID do usuário ( uid
) do banco de dados e ORDER por zip (plz) e uid. Também uso uma variável definida pelo usuário @prev
para verificar se previous
plz é diferente de current plz
. Nesta coluna CASE rownum
deve diminuir a variável inicial definida @row
pelo usuário em 1.
Aqui está a minha consulta para isso ..
SELECT
@prev as previous, @prev := u.plz as current,
CASE
WHEN @prev is null THEN @row := @row -1
WHEN @prev <> u.plz THEN @row := @row -1
ELSE @row END AS rownum,
uid
FROM
(SELECT @prev := NULL, @row := 1001) as r, user as u
LEFT JOIN
geodb_locations ON u.plz = geodb_locations.id
WHERE
u.plz IN(29386,30013,29271,30406) AND
ORDER BY
FIELD(u.plz,29386,30013,29271,30406),
uid DESC
Resultado
+----------+---------+--------+-------+
| previous | current | rownum | uid |
+----------+---------+--------+-------+
| NULL | 29386 | 1001 | 92014 | <-- @prev <> u.plz why NOT decreasing `rownum`
| 29386 | 29386 | 1001 | 87223 |
| 29386 | 29386 | 1001 | 83160 |
| 29386 | 29386 | 1001 | 81322 |
| 29386 | 29386 | 1001 | 81293 |
| 29386 | 29386 | 1001 | 3152 |
| 29386 | 29386 | 1001 | 1939 |
| 29386 | 30013 | 1001 | 65193 | <-- @prev <> u.plz why NOT decreasing `rownum`
| 30013 | 29384 | 1001 | 12883 |
| 29384 | 29385 | 1001 | 32667 |
| 29385 | 29232 | 1001 | 86641 |
| 29232 | 29481 | 1001 | 94521 |
| 29481 | 29481 | 1001 | 33950 |
| 29481 | 29481 | 1001 | 33926 |
| 29481 | 29667 | 1001 | 16027 |
| 29667 | 29667 | 1001 | 496 |
| 29667 | 29355 | 1001 | 96013 |
+----------+---------+--------+-------+
Saída esperada
+----------+---------+--------+-------+
| previous | current | rownum | uid |
+----------+---------+--------+-------+
| NULL | 29386 | 1000 | 92014 | <-- decrease @row `rownum` by one
| 29386 | 29386 | 1000 | 87223 |
| 29386 | 29386 | 1000 | 83160 |
| 29386 | 29386 | 1000 | 81322 |
| 29386 | 29386 | 1000 | 81293 |
| 29386 | 29386 | 1000 | 3152 |
| 29386 | 29386 | 1000 | 1939 |
| 29386 | 30013 | 999 | 65193 | <-- decrease @row `rownum` by one
| 30013 | 29384 | 998 | 12883 |
| 29384 | 29385 | 997 | 32667 |
| 29385 | 29232 | 996 | 86641 |
| 29232 | 29481 | 995 | 94521 |
| 29481 | 29481 | 995 | 33950 |
| 29481 | 29481 | 995 | 33926 |
| 29481 | 29667 | 994 | 16027 |
| 29667 | 29667 | 994 | 496 |
| 29667 | 29355 | 993 | 96013 |
+----------+---------+--------+-------+
Por que CASE WHEN não está funcionando como esperado? Onde está meu erro de pensar? Desde já, obrigado ..
A ordem de avaliação das expressões de saída não é documentada ou especificada. Em geral, a ordem de avaliação corresponde ao texto.
Olhar. Você atribui
@prev := u.plz
e tenta comparar esses valores - mas eles já são iguais devido à atribuição.Coloque esta atribuição APÓS a expressão CASE - neste caso, CASE usará o valor antigo (retirado de cálculos de linhas anteriores).