Autor Zpráva
Michales
Profil
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
Má se zobrazit I1 ve 3/4 případů (tak to máš teď), nebo mají být interpreti stejně pravděpodobní, a k nim pak přidat jejich náhodné album? Toto úplně mění návrh dotazu.
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
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
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
Ať ho študuji sebevíc ten dotaz, tak na to proč to hazí danou chybu nemohu přijít.
Michales
Profil
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
juriad:
Diky, ale zase chyba s existujicim sloupcem.
Unknown column 's.region' in 'group statement
juriad
Profil
Tak snad opraveno (5. řádek). :-(
Michales
Profil
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
juriad:
Jsi super. Děkuji moc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: