MySQL уменьшение пользовательской переменной при изменении значения? - PullRequest
0 голосов
/ 04 августа 2020

У меня проблема с MySQL user defined variables!

Моя таблица выглядит так ...

plz    |    uid
4000        1
4000        2
9000        3
7000        4

Желаемый результат ..

rownum  |  plz    |    uid
1000       4000         1
1000       4000         2
999        9000         3
998        7000         4

Я хочу SELECT несуществующий столбец rownum в качестве флагового столбца вместе с plz и uid столбцом. При изменении значения в столбце plz столбец rownum должен быть уменьшен на 1. Все равно plz должен иметь такой же rownum. plz уникален.

Мой подход ..

SELECT   
  (CASE WHEN @plz <> user.plz THEN @row := @row -1 ELSE @row END) AS rownum, @plz:= user.plz, uid
                                 
FROM             
  (SELECT @row := 1001) r, user
LEFT JOIN 
  geodb_locations ON user.plz = geodb_locations.id 
WHERE 
  user.plz IN(29386,30013,29271,30406)         
ORDER BY 
  FIELD(user.plz,29386,30013,29271,30406), 
  uid DESC

Этот запрос работает, но только при втором вызове. При первом вызове все значения rownum устанавливаются на 1001. Как изменить CASE WHEN statement, которое работает при первом вызове? Есть идеи?

Заранее спасибо !!

Редактировать ЗАПРОС

SELECT   
            @prev as previous, @prev := u.plz as current, CASE 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
                freigeben=1 AND 
                uid != 97548          
            ORDER BY 
                FIELD(u.plz,29386,30013,29271,30406), 
                uid DESC

Вывод правильный, но СЛУЧАЙ, КОГДА кажется неудачным !? rownum всегда равен 1001! Даже если @prev НЕ РАВНО. Любые идеи? В чем моя вина?

Вывод

+----------+---------+--------+-------+
| previous | current | rownum | uid   |
+----------+---------+--------+-------+
| NULL     |   29386 |   1001 | 92014 |
| 29386    |   29386 |   1001 | 87223 |
| 29386    |   29386 |   1001 | 83160 |
| 29386    |   29386 |   1001 | 81322 |
| 29386    |   29386 |   1001 | 81293 |
| 29386    |   29386 |   1001 | 81259 |
| 29386    |   29386 |   1001 | 34213 |
| 29386    |   29386 |   1001 | 34026 |
| 29386    |   29386 |   1001 | 32851 |
| 29386    |   29386 |   1001 | 32668 |
| 29386    |   29386 |   1001 | 32358 |
| 29386    |   29386 |   1001 | 31338 |
| 29386    |   29386 |   1001 | 27765 |
| 29386    |   29386 |   1001 | 26254 |
| 29386    |   29386 |   1001 | 23474 |
| 29386    |   29386 |   1001 | 23130 |
| 29386    |   29386 |   1001 | 20512 |
| 29386    |   29386 |   1001 | 14864 |
| 29386    |   29386 |   1001 | 10951 |
| 29386    |   29386 |   1001 |  8045 |
| 29386    |   29386 |   1001 |  6921 |
| 29386    |   29386 |   1001 |  4459 |
| 29386    |   29386 |   1001 |  3152 |
| 29386    |   29386 |   1001 |  1939 |
| 29386    |   30013 |   1001 | 65193 | <-- @prev <> u.plz why NO 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 |
+----------+---------+--------+-------+
...