ugrás a tartalomhoz

select random rekord - leghatékonyabban

Szekeres Gergő · 2008. Feb. 2. (Szo), 13.22
adott egy tábla, le kellene kérdezni belőle x db rekordot randomra, hogy mindig más jelenjen meg. Eddig én erre az ORDER BY RAND() -ot használtam, viszont most fontos lenne, hogy az eredményeket rendezett formában kapjam meg egy másik mezőre. kicsit utánaolvastam és találtam egy -számomra- meglepő teszteredményt:

post

van valakinek tapasztalata ezzel kapcsolatban? hogyan lehetne megoldani a leghatékonyabban a lekérdezést? itt a 3. változatot hozza ki a leggyorsabbnak, de vajon egy egy több táblás lekérdezésnél és így alakulna?

Eszembe jutott egy másik lehetőség is, egy temporaly táblába raknám a kiválogatott x rekordot, majd ott rendezném, de nem tudom hogy ez gyorsabb lenne-e?
 
1

Kevés rekord

vbence · 2008. Feb. 2. (Szo), 20.58
Ha egyszerre viszonylag kevés rekordot írsz ki, renfezheted PHP-ben.

Ezzel:
 SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;
van egy olyan gond, hogy ha van egy nagyobb lyuk valahol az id-k között, akkor az azt követő id-jű rekord annyiszoros valósínűséggel jön ki, mint a lyuk nagysága.

Kivédhető, ha nem id-re szűrsz, hanem egy második mezőre, amit mindig folyamatosan tartasz.
2

pihentagyú megoldás

sotetbarna · 2008. Feb. 6. (Sze), 11.27
a lehetőségen a hangsúly nem a hatékonyságon

set @valami1=0;
set @valami2=0;
set @valami3=0;
set @valami4=0;
set @valami5=0;
set @valami1=(select tabla_id from tabla where ! tabla_id in (@valami1, @valami2, @valami3, @valami4, @valami5) order by rand() limit 1);
set @valami2=(select tabla_id from tabla where ! tabla_id in (@valami1, @valami2, @valami3, @valami4, @valami5) order by rand() limit 1);
set @valami3=(select tabla_id from tabla where ! tabla_id in (@valami1, @valami2, @valami3, @valami4, @valami5) order by rand() limit 1);
set @valami4=(select tabla_id from tabla where ! tabla_id in (@valami1, @valami2, @valami3, @valami4, @valami5) order by rand() limit 1);
set @valami5=(select tabla_id from tabla where ! tabla_id in (@valami1, @valami2, @valami3, @valami4, @valami5) order by rand() limit 1);
select nev from tabla where tabla_id in (@valami1, @valami2, @valami3, @valami4, @valami5) order by nev;