Autor Zpráva
TomášK
Profil
Mám dotaz, který sestaví pořadí a očísluje záznamy pomocí proměnné:

SET @poradi:=0;
SELECT
    @poradi := @poradi+1 AS poradi,
    body, pomocne_body
...
FROM 
    /* dotaz obsahujici nekolik joinu s poddotazy, groupovani apod., neobsahujici @poradi */
ORDER BY body DESC, pomocne_body DESC;


Dlouho ho používám bez problémů, ale teď mi začal vracet podivné výsledky - pravděpodobně po upgradu MySQL na 5.1. Na serveru se starší verzí MySQL se chová dál dle očekávání - vrátí očíslované záznamy seřazené dle bodů. Na testovacím serveru očísluje záznamy dle jiného kritéria než je v ORDER BY (pravděpodobně náhodně), např. takto:

+------------------------+--------------+
| @poradi := @poradi + 1 | body         |
+------------------------+--------------+
|                     98 |          321 |
|                     72 |          286 |
|                     13 |          269 |
|                     26 |          256 |
|                     30 |          234 |


Setkal se někdo s podobným problémem při přechodu na novou verzi? Lze spolehlivě číslovat bez použití procedur?
nightfish
Profil
otestováno na 1 tabulce (žádné joiny atd.) na mySQL 5.1.39 a 5.4.1 a funguje správně

TomášK:
(pravděpodobně náhodně)
nemohlo by se stát, že to nejdřív všechny řádky očísluje, a až pak je to seřadí podle `body`?
Kajman_
Profil *
TomášK:
Nepomůže zanořit řazení?
select poradi, body
from (select ... order by body) t
order by body
TomášK
Profil
nightfish:
Pravděpodobně ano - ale myslím, že nikde není řečeno, jak řádky budou seřazené před očíslováním - tudíž je to pro mě totéž jako náhodné.

Kajman
Dík, pomohlo. Funguje mi to i bez řazení v poddotazu, tj takto:

SELECT 
  poradi, body 
FROM ( SELECT * FROM /*slozity dotaz bez order */ ) t
ORDER BY body


Neví někdo, jestli je to bug nebo MySQL jen nezaručuje, kdy se proměnná přiřadí? Jde mi hlavně o to, jestli se to v příští verzi může zase 'rozbít'...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: