Autor Zpráva
Kcko
Profil
Bohužel se musím ozvat ješte jednou. Narážím na něco podobného jako v předchozím topicu , ale nemůžu na to zas přijít, zase mi to vyhazuje stejný nesmysl, nemůžu tohle vícenásobné count-ování v jednom dotazu pochopit.

SELECT
h.jmeno,
h.prijmeni,
COUNT(DISTINCT  hu.id_utkani) zapasy,
COUNT(DISTINCT g.id) goly,
hu.id_hrac,
hu.id_tym

FROM 

hraci_utkani hu 
JOIN utkani u ON u.id_utkani = hu.id_utkani
JOIN hraci h ON h.id_hrac = hu.id_hrac
LEFT JOIN goly g  ON g.id_utkani = hu.id_utkani

WHERE u.soutez = "III. divize - sever" 
AND u.sezona = 2012
AND u.stav = "odehráno" 

GROUP BY hu.id_hrac


Tabulky

hraci
id_hrac (PK) | jmeno | prijmeni ...

utkani
id_utkani (PK) | sezona | soutez ...

hraci_utkani
id (PK) | id_utkani | id_hrac ...

goly (v teto tabulce se objevi zaznam kdyz da hrac gol, nebo kdyz asistuje a pote je jeho id zaznamenano v id_asistence)
id (PK) | id_utkani | id_hrac | id_asistence


Potřebuji souhrnný výpis hráčů z určité sezóny a soutěže, počet zápasů, ke kterým nastoupili, počet vstřelených branek a asistencí. Viz dotaz výše, at to zkouším jak to zkouším, tak bud mi to špatně ukáže branky nebo góly (dle toho jak grupuji podle hu.id_hrac nebo g.id_hrac) a přijoinovat asistence už jsem raději ani nezkoušel, prostě těm vícero Countům v 1 dotaze nerozumím.

Mrkne se na to někdo? (Kajman?) Případně nějaký zdroj, abych veděl jak s tím naložit, než se pustím do PHP logiky a výpočtů.
Kajman
Profil
Chybí ti tam podmínka na autora gólu.
...
COUNT(DISTINCT g.id) goly,
COUNT(DISTINCT a.id) asistence,
...
LEFT JOIN goly g  ON g.id_utkani = hu.id_utkani AND g.id_hrac=hu.id_hrac
LEFT JOIN goly a  ON a.id_utkani = hu.id_utkani AND a.id_asistence=hu.id_hrac
Kcko
Profil
Kajman:
Když na to takhle koukám, tak je mi to jasné. Ale vždy až po tvém zásahu :), díky moc.

Nešel by ten dotaz nějak urychlit, poprvé dotaz trvá cca 1,5s, pak už je rychlý.
EXPLAIN vypadá dle mě celkem OK.

Kajman
Profil
Možná by byly pro tento dotaz vhodné tyto vícesloupcové indexy
utkani (sezona, soutez, stav)
hraci_utkani (id_utkani, id_hrac)
goly (id_utkani, id_hrac)
goly (id_utkani, id_asistence)

Ale zase se nemusí hodit pro jiné dotazy.

Pomalost prvního dotazu může být způsobená prodlevou disku, pokud se zatím z db k tabulkám vůbec nepřistupovalo. Další dotazy už mohou mít zapamatovaný vhodný plán. A ještě může být výsledek předchozího stejného dotazu v cache, jen pro test rychlosti je tedy lepší použít
select sql_no_cache h.jmeno, ...
Kcko
Profil
Kajman:
S indexy si zkusím pohrát. S sql_no_cache se to dostane na 0,1s, což je celkem v pořádku, takže tam skutečně bude něco na disku a není to problém DB. Děkuji.

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:

0