Autor | Zpráva | ||
---|---|---|---|
Michales Profil |
#1 · Zasláno: 11. 10. 2015, 15:11:17
Ahoj, v následujícím scriptu zobrazuji data z db.
Je to rozdělený do 3 skupin, F, O, a H. Nyní mi to vypisuje všechny data do 3 skupin, chtěl bych aby mi to vypisovalo vždy jen jeden údaj v příslušné skupině. Jak aplikovat LIMIT 1 do dotazu? Pokud tam nyní přidám ten LIMIT zobrazí se jen jeden údaj. Script: <?php include "settings.php"; $query = "select name,region,interprets.`id`, count(*) as `pocet_alb` from `interprets` left join `albums` a on a.`interpret` = interprets.`id` group by `interpret` ORDER BY region, rand(), name ASC"; $result = mysql_query($query) or die(Mysql_error()); $old = ""; while($results=MySQL_Fetch_Assoc($result)) { if($results['region'] != $old) { if($old != "") { echo "</p>"; } if($results['region'] == 'F') { echo "<p style='text-align: center;'>"; } if($results['region'] == 'H') { echo "<p style='text-align: center;'>"; } if($results['region'] == 'O') { echo "<p style='text-align: center;'>"; } } echo $results['name'].' ('.$results['pocet_alb'].') '; $old = $results['region']; } ?> |
||
juriad Profil |
Aha, takže máš interprety, kteří jsou pro určitý region. Interpreti mají alba (1:N). A ty chceš pro každý region náhodného interpreta a k němu náhodné album. Napřed se musím zeptat: co má být stejně pravděpodobné interpreti nebo alba.
Neuvažujme regiony, jen interprety a alba. I1, A1 I1, A2 I1, A3 I2, B1 |
||
Michales Profil |
juriad:
Má se zobrazit jeden náhodný interpret z každého regionu. Tzn. 3 interpreti a každý z nich bude mít jiný region. U každého interpreta by měl být počet jeho alb. Při každém načtení stránky bude interpret vždy náhodně vybraný z db, pomocí ORDER BY rand(). Nyní script výše dělá toto: testmichales.comehere.cz/interpreti.php A má být v každé kategorii, jeden interpret a k němu příslušný počet alb. |
||
juriad Profil |
Michales:
Aha, já jsem si to špatně přečetl, myslel jsem, že chceš zobrazit i náhodné album. Ok tedy. SELECT i.name, i.region, i.id, COALESCE(p.pocet, 0) AS pocet_alb FROM ( SELECT s.id FROM ( SELECT i.id, i.region FROM interprets i ORDER BY rand() ) AS s # náhodně zamíchaní interpreti GROUP BY s.region ) AS r # náhodný jeden interpret pro region JOIN interprets AS i ON r.id = i.id # informace o interpretovi pro vybrané náhodné LEFT JOIN ( SELECT a.interpret, COUNT(a.id) AS pocet FROM albums a GROUP BY a.interpret ) AS p ON r.id = p.interpret # počty alb pro jednotlivé interprety ORDER BY i.region V MySQL se prý napřed grupuje a potom až řadí. Ale ze skupiny se vybere snad první náhodný Opraveno, 14., 13., 9., 5., 16. řádka. |
||
Michales Profil |
#5 · Zasláno: 11. 10. 2015, 16:15:04
juriad:
Díky. Ale mám problém že tvůj dotaz háže chybu: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) AS pocet FROM albums GROUP BY a.interpret ) AS p ON r.id = p.interpret' at line 13 |
||
lionel messi Profil |
Michales:
„Ale mám problém že tvůj dotaz háže chybu:“ V [#4] juriad používa alias a , ktorý ale nikde nedefinuje:
SELECT i.name, i.region, i.id, COALESCE(p.pocet, 0) AS pocet_alb FROM ( SELECT s.id FROM ( SELECT i.id FROM interprets i ORDER BY rand() ) AS s # náhodně zamíchaní interpreti GROUP BY i.region ) AS r # náhodný jeden interpret pro region JOIN interprets AS i ON r.id = i.id # informace o interpretovi pro vybrané náhodné LEFT JOIN ( SELECT a.interpret, COUNT(a.*) AS pocet FROM albums a GROUP BY a.interpret ) AS p ON r.id = p.interprets # počty alb pro jednotlivé interprety ORDER BY i.region Pardon za duplicitu. |
||
Michales Profil |
#7 · Zasláno: 11. 10. 2015, 16:29:35
lionel messi:
Toho jsem si po té také všiml že je použit alias a a neni definovaný, ovšem chybu to nezměnilo. |
||
Michales Profil |
#8 · Zasláno: 11. 10. 2015, 17:36:14
Ať ho študuji sebevíc ten dotaz, tak na to proč to hazí danou chybu nemohu přijít.
|
||
Michales Profil |
#9 · Zasláno: 11. 10. 2015, 21:51:17
Když jsem upravil COUNT(a.*) na COUNT(a.id), tak mi to zase haže chybu že neexistuje sloupec i.region. Už mě nenepadá co dále.
|
||
juriad Profil |
Michales:
Opraveno v [#4]. Promiň, takové dotazy se obvykle píší a testují po částech. Ještě mám poznámku, že toto využívá vlastnosti (někdo by řekl chyby) MySQL. V jiných databázích by to neprošlo (v poddotazu na 3. řádce musí být všechny sloupce buď uvedeny v GROUP BY (což by v připadě s.id zrušilo GROUP BY a vysledkem by byly všechny záznamy) nebo být výsledkem agregacní funkce (což by nám zrušilo náhodnost). Je dost pravděpodobné, že to v MySQL nezmění a že to bude fungovat i v budoucnu. Nejsem si vědom způsobu, jak ten dotaz provést čistě a přenositelně. Umí to někdo? |
||
Michales Profil |
#11 · Zasláno: 11. 10. 2015, 22:08:03
juriad:
Diky, ale zase chyba s existujicim sloupcem. Unknown column 's.region' in 'group statement |
||
juriad Profil |
#12 · Zasláno: 11. 10. 2015, 22:11:52
Tak snad opraveno (5. řádek). :-(
|
||
Michales Profil |
#13 · Zasláno: 11. 10. 2015, 22:16:49
juriad:
Bohužel. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT i.id, i.region FROM interprets i ORDER BY rand() ) AS s G' at line |
||
juriad Profil |
Další opravy (ale ne tam, kde ti to hází chybu). Teď už mi to funguje. Viz sqlfiddle.com/#!9/b7738/2
|
||
Michales Profil |
#15 · Zasláno: 11. 10. 2015, 22:34:02
juriad:
Jsi super. Děkuji moc. |
||
Časová prodleva: 9 let
|
0