Autor | Zpráva | ||
---|---|---|---|
MaK Profil |
#1 · Zasláno: 4. 4. 2019, 11:49:18
Ř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 |
#2 · Zasláno: 4. 4. 2019, 12:04:37
Nové verze MySQL už znají row_number funkci.
|
||
Kajman Profil |
#3 · Zasláno: 4. 4. 2019, 12:41:21
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 |
#4 · Zasláno: 4. 4. 2019, 13:24:11
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 |
#5 · Zasláno: 4. 4. 2019, 13:42:50
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. |
||
Časová prodleva: 5 let
|
0