Autor | Zpráva | ||
---|---|---|---|
jboob Profil |
Dobrý den,
potřeboval bych jednu začátečnickou radu jak napsat správně select. s Group by se mi úplně nedaří Dělám statistiku atletických běžeckých výkonů. Tabulka má několik desítek tisíc záznamů a já bych z ní potřeboval vytáhnout jaký si top: 1) absolutně nejlepší výkon v každé disciplíně, 2) nejlepší výkony v disciplínách pro vybraného závodníka. Sloupce jsou ID závodníka, disciplína, čas v sec. díky za radu |
||
juriad Profil |
Nejlepší výsledy pro disciplínu:
SELECT t.* FROM tabulka t JOIN ( SELECT MIN(cas) as min_cas, disciplina FROM tabulka GROUP BY discicplina ) m ON t.disciplina = m.disciplina AND t.cas = m.min_cas Nejlepší výkon závodníka v každé disciplíně (pokud má tabulka skutečně jen tyto tři sloupce a žádné jiné): SELECT MIN(cas) as min_cas, disciplina FROM tabulka GROUP BY disciplina WHERE zavodnik = $zavodnik Pokud by tabulka měla víc sloupců: SELECT t.* FROM tabulka t JOIN ( SELECT MIN(cas) as min_cas, zavodnik FROM tabulka GROUP BY zavodnik ) m ON t.zavodnik = m.zavodnik AND t.cas = m.min_cas WHERE t.zavodnik = $zavodnik Opraveny aliasy |
||
jboob Profil |
#3 · Zasláno: 30. 1. 2016, 19:40:01
jboob:
diky moc, mám ale pocit, že to nefunguje zcela korektně. asi jsem někde něco upravil chybně. můžete se prosím mrknout. Ještě pokud bych chtěl přidat další výběrové kriterium např. omezit na období určitého roku doplním jen do závěrečné WHERE FROM pl_stat t JOIN ( SELECT MIN(cas_sec) as min_cas, dis FROM pl_stat GROUP BY dis ) m ON t.id_os = t.id_os AND t.cas_sec = m.min_cas WHERE t.id_os = $vidz |
||
juriad Profil |
#4 · Zasláno: 30. 1. 2016, 19:42:27
jboob:
Promiň, měl jsem tam chybku. ) m ON t.id_os = m.id_os AND t.cas_sec = m.min_cas |
||
jboob Profil |
#5 · Zasláno: 30. 1. 2016, 19:53:29
tak nevim. asi dělám někde ještě chybu, ale nedývá mi to žádný výsledek a píše chybu sql
|
||
juriad Profil |
#6 · Zasláno: 30. 1. 2016, 19:57:55
Aha. To je, když člověk kopíruje. Opraveno.
|
||
jboob Profil |
#7 · Zasláno: 30. 1. 2016, 20:15:45
Díky, teď již to trochu funguje. Akorát mi to vypíše je jednu disciplínu tu s nejlepším časem.
|
||
Kajman Profil |
#8 · Zasláno: 31. 1. 2016, 00:12:17
jboob:
Pokud děláte omezení na závodníka, použijte druhý dotaz z [#2]. |
||
jboob Profil |
#9 · Zasláno: 31. 1. 2016, 10:37:24
Dobrý den,
omlouvám se, že ještě obtěžuji , ale stále se mi nedaří dosáhnout chtěného výsledku. Dotaz [ MySQL - výběr nejlepších hodnot]. se mi nehodí, neboť tabulka má ještě další sloupce. Potřebuji dostat nejlepší výkony ve všech disciplínách pro konkrétního závodníka, případě ještě v určitém časovém období, definováno rokem. Zkusil jsem ještě následející jednoduchý dotaz, který v podstatě dělá to co chci. Akorát GROUP by nevybírá nejlepší čas SELECT * FROM pl_stat WHERE id_os = $vidz group by dis order by cas_sec ASC Prosím ještě jednou o radu jak toho docílit . Děkuji |
||
juriad Profil |
#10 · Zasláno: 31. 1. 2016, 10:42:59
jboob:
Použij ten poslední dotaz uvedený v [#2]. Tam záměrně uvádím, že jednoduchý dotaz funguje, jen když tabulka má tyto tři sloupce. Ty navíc v [#9] ani nikde nepracuješ s minimem. Ten tvůj dotaz ve skutečnosti vybere náhodný záznam pro každou disciplínu (a dokonce to může být kombinace různých záznamů). |
||
jboob Profil |
#11 · Zasláno: 31. 1. 2016, 11:00:00
ten jsem zkoušel použít, ale asi někde dělám chybu, protože mi vybere pouze disciplínu s absolutně nejlepším časem
SELECT t.* FROM pl_stat t JOIN ( SELECT MIN(cas_sec) as min_cas, id_os FROM pl_stat GROUP BY id_os ) m ON t.id_os = m.id_os AND t.cas_sec = m.min_cas WHERE (t.id_os = $vidz and t.obdobi = $rok) |
||
Kajman Profil |
SELECT t.* FROM pl_stat t JOIN (SELECT Min(cas_sec) AS min_cas, dis FROM pl_stat WHERE id_os = $vidz AND obdobi = $rok GROUP BY dis) m ON t.id_os = $vidz AND t.cas_sec = m.min_cas AND t.dis = m.dis AND t.obdobi = $rok Edit: přidána zapomenutá podmínka |
||
jboob Profil |
#13 · Zasláno: 31. 1. 2016, 20:35:27
Děkuji,
teď je to přesně ono |
||
Časová prodleva: 9 let
|
0