Autor Zpráva
MaK
Profil
Řešení uvedené v FAQ je pod MySQL nepoužitelné v okamžiku, kdy přidám ORDER BY, který je pravděpodobně realizován přes: Using temporary + Using filesort.

Např.:

CREATE TABLE `aaa` (
  `a` int(11) NOT NULL
);

INSERT INTO `aaa` (`a`) VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
COMMIT;

SELECT @radek:=@radek+1 rownum, a 
FROM (SELECT @radek:=0) r
JOIN aaa
ORDER BY RAND()


Zná někdo řešení, které nemá chybu? Očíslovat si řádky ve vyšší vrstvě nemohu, potřebuji INSERT ... SELECT ...

MaK
Keeehi
Profil
Nové verze MySQL už znají row_number funkci.
Kajman
Profil
row_number bude jistější
SELECT Row_number() OVER(ORDER BY Rand()) rownum,
       t.*
FROM   aaa t
ORDER  BY 1  

ve složitých dotazech bývaly s uživatelskými proměnnými problémy a vyhnul bych se jim, ale tento malý případ by asi šel přepsat takto
SELECT     @radek:=@radek+1 rownum,
           a
FROM       (SELECT @radek:=0) r
CROSS JOIN (SELECT t.*, Rand() raz FROM aaa t) b
ORDER BY   b.raz 
MaK
Profil
Kajman:
row_number() je hezký, ale nemám osmičky.

Co mi hlava nebere, proč váš SELECT netrpí stejnou chybou, jako můj SELECT.
MySQL přerovná výsledek subquery a pak ho teprve 'posilá' do výstupu a čísluje? Dá se na to spolehnout?

MaK
Kajman
Profil
Já bych se na nic s uživatelskými proměnnými v dotaze nespoléhal.

V mariadb jsou window funkce od verze 10.2, to bývá na hostinzích běžnější než mysql 8.0.

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:

0