ugrás a tartalomhoz

MySQL order by rand()

TIV · 2008. Jún. 19. (Cs), 22.53
Sziasztok!

Nagyon felmérgel a dolog, nem tudok véletlenszerűen kiválasztani 5 sort, ha order by-al rendezem az oszlopokat.

SELECT c.id, c.cim, c.url
FROM cikk c, stat s
WHERE c.id = s.id
ORDER BY s.latogatok DESC
LIMIT 5


Ez kiválasztja ugye az 5 legnézettebb cikket. Viszont hülyeség a limit 5, mert nekem a legnézettebb 30 kell, amiből aztán véletlenszerűen szeretnék ötöt. Hogy lehet ezt megvalósítani? Próbáltam a rand()-ot mindenféleképpen beletenni, de sehogy nem jött össze, neten alig van erről írás. két limit kellene? egyszer a 30-nak, máskor az 5nek? maradjak phpnél? subqueryval is próbáltam, de ott ugye nincs limit, szóval megbukott a tudomány(om).

Segítség!
Előre is köszi!
 
1

Allekérdezés

Őry Máté · 2008. Jún. 19. (Cs), 23.37
Hirtelen egy csúnya és lassú megoldásra futja:
  1. SELECT id, cim, url FROM cikk   
  2. WHERE id IN (  
  3.   SELECT id FROM stat   
  4.   ORDER BY latogatok DESC  
  5.   LIMIT 30  
  6. )  
  7. ORDER BY rand()  
  8. LIMIT 5  
3

én szóltam

TIV · 2008. Jún. 20. (P), 22.38
subqueryval is próbáltam, de ott ugye nincs limit

MySQL - 5.0.45:
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
7

inline view

Hodicska Gergely · 2008. Jún. 22. (V), 11.45
Olvasd el pontosan a hibaüzenetet, nem azt mondja, hogy nem lehet subqueryben limit, hanem adott típusúban nem lehet. Inline viewban lehet nyugodtan, például (nem tesztelve, de ennek kb. mennie kell):
  1. SELECT   
  2.     c.id  
  3.     ,c.cim  
  4.     ,c.url   
  5. FROM  
  6.     (   /* a 30 leglatogatottabbol kivalasztunk egyet veletlenszeruen */  
  7.         SELECT  
  8.             id  
  9.         FROM   
  10.             (   /* megszerezzuk a 30 leglatogatottabb cikk id-jat */  
  11.                 SELECT  
  12.                     id  
  13.                 FROM  
  14.                     stat  
  15.                 ORDER BY   
  16.                     latogatok DESC    
  17.                 LIMIT 30  
  18.             ) sub_helper  
  19.         ORDER BY  
  20.             rand()  
  21.         LIMIT  
  22.             1  
  23.     ) sub  
  24.     JOIN cikkek c ON c.id = sub.id  
Üdv,
Felhő
2

30at

vbence · 2008. Jún. 19. (Cs), 23.42
Kikéred a 30at egy tömbbe, majd a php kiválogat 5-öt véletlenszeűen? (Így a mysql cache-elni tudja a query eredményét).
4

ez lesz

TIV · 2008. Jún. 20. (P), 22.39
ez lesz, csak azt hittem ezt a primitív feladatot meg tudja oldani egy MYSQL...:S
5

temp tábla?

Szekeres Gergő · 2008. Jún. 21. (Szo), 12.07
a phps megoldás helyett: létrehozol egy temporaly táblát, ebbe egy insert .. select lekérdezéssel felöltesz 30sort, majd innen randommal lekérdezed. hogy gyorsabb, azt nem tudom, de ha spt írsz rá akkor biztos! :)
6

mit?

TIV · 2008. Jún. 22. (V), 00.30
Mi az az sp?:D service pack?:D
8

stored procedure

Szekeres Gergő · 2008. Jún. 22. (V), 13.41
http://dev.mysql.com/doc/refman/5.0/en/stored-procedures.html