Výpis skupin s náhodným prvkem
Školení, která pořádám
Pokud chceme v seznamu skupin zobrazit také jejich jeden náhodný prvek, napadne nás nejprve asi takovýto kód:
<?php
$result = mysql_query("SELECT * FROM skupiny");
while ($row = mysql_fetch_assoc($result)) {
$nahodny = mysql_fetch_assoc(mysql_query("SELECT * FROM prvky WHERE skupina = $row[id] ORDER BY RAND() LIMIT 1"));
}
mysql_free_result($result);
?>
Problém s tímto kódem je v tom, že dotazy klade opakovaně při procházení cyklu, takže bude velmi pomalý. Pokud nám z dotazované tabulky stačí jeden sloupec, dá se využít poddotaz:
SELECT nazev, (SELECT nazev FROM prvky WHERE skupina = skupiny.id ORDER BY RAND() LIMIT 1) nahodny FROM skupiny;
Pokud bychom sloupců potřebovali více, tak by se dotaz značně zkomplikoval a neprováděl by se efektivně. Pokud bychom použili prosté spojení tabulek a agregaci, tak vrátí MySQL pro každou skupinu náhodný záznam – náhodný ovšem v tom smyslu, že je to první, který je po ruce, takže většinou pořád ten stejný, i když se na to nedá spolehnout.
Přijďte si o tomto tématu popovídat na školení Návrh a používání MySQL databáze.
Diskuse
Meluzina:
A co takle:
SELECT prvek,skupina FROM (SELECT prvek,skupina FROM prvky ORDER BY RAND()) as prvky2 GROUP BY skupina
Chytré. Pokud bychom chtěli vypisovat i skupiny bez prvků, tak by se tam tabulka skupin musela ještě připojit, podstata myšlenky je ale jasná.
Gorog:
dela to jen me nebo ta reklama google zpusobuje to ze kod musim strasne rolovat do sirky? Opera.
Tomáš Fejfar:
Jo. Mám stejný problém - ve škole. Doma mam AdBlock :D
Shark:
Buď v pohodě. V Opeře se alespoň zobrazuje posuvník u druhého kódu, kdežto když jsem si tuto stránku pokusně prohlídl ve Firefoxu 2.0.0.1 tak se zobrazil neúplný kód končící před slovem náhodný. Myší to sice šlo označit a hejbat s tím, ale když tam nebyl posuvník, tak mě to hned nenapadlo.
Jakub Vrána :
Můžete mi prosím poslat screenshot? Ani v jednom prohlížeči zmíněné chování nepozoruji.
Když je kód širší než viditelná oblast, tak se zobrazí s posuvníkem - to je ale záměr a s reklamou nijak nesouvisí.
Bob:
Taktéž nevidím druhý kód pouze posuvník na IE7 + Maxthon. Firefox i opera bez problémů.
Jakub Vrána :
Díky za upozornění. V IE 7 jsem byl schopen tento problém reprodukovat a opravil jsem ho. V ostatních prohlížečích nikoliv.
Gimli2:
Opera 9.2 - Po natazeni obrazku ok. Do te doby se ALT pod obrazkem "Make a Donation" roztah mimo obrazovku a logicky tam byl horizontalni posuvnik. Tedy mozna pricina Gorogova problemu...
Jakub Vrána :
Díky za upozornění, doplnil jsem tam rozměry a změnil ALT.
kozoslon:
ale jak jinak bys udělal výpis náhodného řádku tabulky?
Jakub Vrána :
Dá se to řešit tak, že zjistíš celkový počet řádků z tabulky a použiješ LIMIT 1 OFFSET $rand, kde $rand si naplníš na aplikační úrovni.
Diskuse je zrušena z důvodu spamu.