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 |
#2 · Zasláno: 7. 1. 2013, 08:46:31
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 |
#4 · Zasláno: 7. 1. 2013, 11:32:38
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 |
#5 · Zasláno: 7. 1. 2013, 11:56:32
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. |
||
Časová prodleva: 11 let
|
0