ugrás a tartalomhoz

Véletlenszerű lekérdezés

kisstoth · 2006. Május. 7. (V), 17.19
Közvetlenül MySQL-ben van arra lehetőségem, hogy egy táblából véletszenszerűen válasszon ki 50 rekordot, majd azt véletlenszerű sorrendbe tegye? Olyasmire gondolok, mint amilyen pl. a shuffle() függvény PHP-ben. A MySQL-beli rand() függvény többszöri lefuttatása azért nem jó, mert ebben az esetben egy rekord többször is szerepelhet.

Gondoltam arra is, hogy lekérem az összes rekordot, majd PHP-ből shuffle() és csak 50 velemre csonkítom a tömböt. De ez ennek nincs sok értelme, sok rekordnál nem lehet valami gyors megoldás.

Van valakinek javaslata?
 
1

limit?

gnycz · 2006. Május. 7. (V), 17.59
SELECT * FROM tablename ORDER BY RAND() LIMIT 50
2

ez nem igazán jó

inti · 2006. Május. 7. (V), 19.19
mert a rand() oszloponként randomizál, így kevés oszlop esetén sorban az első 50-et fogja bedobálni. Én azt javaslom, ugyan ez kicsit erőforrásigényesebb, hogy kérd le a tábla sorainak számát ($max), abból generálj egy random számot:

$random_offset = rand(0,$max-50);

majd pedig az alábbi lekérdezéssel

SELECT * FROM tablename LIMIT $random_offset,50

kapsz random helyről kiindulva 50 egymást követő elemet a táblából.
Ha még jobban keverni akarod, erre ráküldhetsz még egy shuffle()-t, vagy az előbbi lekérdezésbe belerakhatod, hogy

ORDER BY RAND()

és akkor soronként rendezget is, ami megint megkavarja picit. Esetleg csinálhatsz két 25-ös lekérdezést, és összekeverheted az eredményüket, de ott is az alapkoncepció a fenti. Jó munkát!
3

pedig jó

Hodicska Gergely · 2006. Május. 7. (V), 23.08
Teljesen jó gndl megoldása, próbáld ki!


Felhő
4

bocs, csak a rend kedvéért

inti · 2006. Május. 8. (H), 10.08
Én sem mondtam, hogy nem jó, de egyéb fórumokon is utánajártam a dolognak, mert a minap nekem is kellett, és nem nagyon dícsérték az ORDER BY RAND()-os megoldást. Óvatosságra intettek a használatával, mert SQL változattól függően máshogy viselkedhet. Relative "szebb" random értéket ad az, amit én írtam, de mindenki azt használ, amit jónak lát.Ami esetleg ugyanazt az eredményt adhatja egy elég nagy listából, két egymást követő lekérdezésre, az nekem nem tetszik, és a ORDER BY RAND()-os megoldás ilyen.
5

milyen fórumban?

Hodicska Gergely · 2006. Május. 8. (H), 16.43
Ezt írtad:
mert a rand() oszloponként randomizál, így kevés oszlop esetén sorban az első 50-et fogja bedobálni.

Ennek igazából nem is igazán van értelme, szóval nem is érthető, hogy mit szerettél volna.

egyéb fórumokon is utánajártam a dolognak, mert a minap nekem is kellett, és nem nagyon dícsérték az ORDER BY RAND()-os megoldást. Óvatosságra intettek a használatával, mert SQL változattól függően máshogy viselkedhet.

Kíváncsi lennék valami konkrétumra ezzel kapcsolatban. Nem mindegy, hogy milyen fórumot olvasol, nem kell mindent elhinni.

Relative "szebb" random értéket ad az, amit én írtam, de mindenki azt használ, amit jónak lát.

Szerintem meg ritka rossz megoldás. Eleve a Te megoldásodban mindig 50 egymást követő elemből fog állni a találati lista, tehát pont kevésbé lesz random, mint a kiindulási állapotban lévő, plusz még bonyolultabb kódot fog eredményezni. Viszont az sem igaz, hogy erőforrásigényesebb lenne, hiszen ott nem kell rendezni, és az első 50 sor után le is állhat a query, mig az order by rand esetben nem.

Ami esetleg ugyanazt az eredményt adhatja egy elég nagy listából, két egymást követő lekérdezésre, az nekem nem tetszik, és a ORDER BY RAND()-os megoldás ilyen.

Próbáld ki azért, mielőtt leírod: sose tapasztaltam még ilyesmit.


Felhő
6

Ez hülyeség

Anonymous · 2006. Május. 8. (H), 18.50
Gondold végig! A RAND() egy lebegőpontos számot ad vissza 0 és 1 között, szerinted lenne értelme annak hogy "ORDER BY 0.12612", mert szerintem nem. Az "ORDER BY RAND()" - szvsz - külön kifejezés a MySQL-ben, és teljesen más algoritmus értékeli ki, mint mikor a RAND() mint matematikai függvény szerepel.
8

Az SQL nem így működik

Bártházi András · 2006. Május. 8. (H), 21.21
Miért, amikor azt írom, hogy ORDER BY id, akkor mi helyettesítődik be? A sorok összehasonlításakor az adott oszlop értéke. No, itt meg soronként egy véletlenszám. Azaz mindig más. Teljesen rossz az SQL értelmezésed.
7

rand() hiba javítva

Jano · 2006. Május. 8. (H), 19.45
MySQL Bugs: #817: Order by RAND() .... not really random

[9 Jul 2003 11:13] Paul DuBois

Thank you for your bug report. This issue has already been fixed
in the latest released version of that product
9

működik

kisstoth · 2006. Május. 9. (K), 22.39
Köszi a segítséget, tökéletes. :)