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
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
jboob:
Promiň, měl jsem tam chybku.
) m ON t.id_os = m.id_os AND t.cas_sec = m.min_cas
jboob
Profil
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
Aha. To je, když člověk kopíruje. Opraveno.
jboob
Profil
Díky, teď již to trochu funguje. Akorát mi to vypíše je jednu disciplínu tu s nejlepším časem.
Kajman
Profil
jboob:
Pokud děláte omezení na závodníka, použijte druhý dotaz z [#2].
jboob
Profil
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
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
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
Děkuji,
teď je to přesně ono

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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