Autor Zpráva
Lonanek
Profil
Řeším dilema sčítání položek tabulky.

TAB1 obsahuje výkony hráčů
TAB2 obsahuje jejich data.

SELECT TAB1.*, SUM(TAB1.vykon), TAB2.*
 FROM TAB1
  JOIN TAB2 ON TAB1.id=TAB2.id
 WHERE podminka
 GROUP BY TAB1.den, TAB1.termin
 HAVING SUM(TAB1.vykon)
Tohle mi správně sečte oba výkony, ovšem při použití GROUP nelze získat jméno druhého hráče, protože seskupuji jejich společný termín dosažení výkonu.

Lze ještě dotaz upravit tak, abych získal obě jména a správný součet výkonů?

Návrh TAB1 původně počítal pouze s výkony jednotlivců a zadavatel nyní požaduje výkony dvojic.
Je lepší sčítání výkonů řešit na úrovni databáze, nebo na úrovni scriptu s novou tabulkou součtu obou?

Díky za nakopnutí.
Kajman
Profil
Použijte dva dotazy. Např. jeden na sečtení výkonů obou hráčů a druhý na jejich identifikaci.
Lonanek
Profil
Díky za reakci, ale obávám se, že to nebude to pravé řešení.
Pokud v prvním dotazu zjistím jména hráčů a v druhém součet obou hráčů, vždy uvidím id pouze jednoho, takže správné přiřazení do dvojice by nemuselo být správné.

Jednodušší zřejmě bude vytvořit novou součtovou tabulku a tu plnit scriptem podle zadaných výsledků, i to bude tak trochu oříšek.

Jak jsem psal, bohužel původní tabulka není správně navržena pro tyto účely.
Kajman
Profil
Lonanek:
správné přiřazení do dvojice by nemuselo být správné

Myslel jsem, že dotaz vrátí vždy součty pro jednu dvojici omezenou díky where. Můžete tedy lépe popsat strukturu tabulek a jejich data?
Lonanek
Profil
Zjednodušený popis struktury tabulek:
Tabulka výkonů (sto_hs_dvojice):
id, id_termin, hrac, vykon, ...

Tabulka termínů (turnaje_termin):
idtt, id_hrace, draha, datum, cas_od, cas_do, ...

Pro potřeby výkonů jednotlivců byl návrh tabulky dostačující.

Kajman:
Myslel jsem, že dotaz vrátí vždy součty pro jednu dvojici omezenou díky where.
Na to není struktura stavěná. Každý hráč je zapsán samostatným výkonem a jediné pojítko je datum a čas startu.

---------
Tedy celý dotaz je pak:
SELECT h.jmeno, h.prijmeni, h.klub, s.registrovany, s.rocnik, SUM(s.vykon) AS vykon
 FROM turnaje_termin AS t
  LEFT JOIN sto_hs_dvojice AS s
   ON t.idtt=s.id_termin
  JOIN hraci AS h
   ON h.idh=s.hrac
 WHERE s.stav='1' AND s.hrac=h.idh
 GROUP BY t.datum, t.cas_od, t.cas_do
 HAVING SUM(s.vykon)
 ORDER BY s.rocnik DESC, vykon DESC
Kajman
Profil
No, ideální to není, ale data asi půjde vysosat (pokud tam nebudou kolize více lidí se stejným startem).

Buď půjde group by nad termíny a tabulku s výkony hráčů připojit dvakrát, jednou s min(id_hrace) a jednou s max. Nebo tabulku termínů spojit se sebou samou, se stejným časem ale vyšším id_hrace, žáleží, zda z termínů potřebujete i nějaké jiné sloupce různé pro oba hráče.
Lonanek
Profil
No vzhledem k tomu, že přibyly další požadavky jako je statistika, kontrola startu, zda dvojice nenastoupila 2x, rozdělení podle kategorií (regi, neregi) bude asi schůdnější vše vyřešit scriptem do samostatné tabulky výkonů celé dvojice a z té pak cucat potřebná data.

Ukázka v praxi zde Průběžné výsledky.

Kajman:
Díky za pomoc.

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