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:
SELECT id, cim, url FROM cikk 
WHERE id IN (
  SELECT id FROM stat 
  ORDER BY latogatok DESC
  LIMIT 30
)
ORDER BY rand()
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):
SELECT 
	c.id
	,c.cim
	,c.url 
FROM
	(   /* a 30 leglatogatottabbol kivalasztunk egyet veletlenszeruen */
		SELECT
			id
		FROM 
			(   /* megszerezzuk a 30 leglatogatottabb cikk id-jat */
				SELECT
					id
				FROM
					stat
				ORDER BY 
					latogatok DESC  
				LIMIT 30
			) sub_helper
		ORDER BY
			rand()
		LIMIT
			1
	) sub
	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