Autor Zpráva
Work
Profil
Zdravím řeším takový problém a nikde jsem nenašel odpověď na můj problém.

Jde o to že chci udělat seřazení hráčů podle jejich populace, populace se dělí na pracující a nepracující nevolníky.

Mám takovýto dotaz:
SELECT bfe_hrac.nick, bfe_hrac.ID, bfe_hrac.ID_narod, COUNT(bfe_hrac_mesta.ID), SUM(bfe_hrac_mesta.nev)+SUM(bfe_hrac_budovy.nev) 
FROM bfe_hrac 
LEFT JOIN bfe_hrac_budovy ON bfe_hrac.ID = bfe_hrac_budovy.ID_hrace 
LEFT JOIN bfe_hrac_mesta ON bfe_hrac.ID = bfe_hrac_mesta.ID_hrace 
GROUP BY bfe_hrac_mesta.ID_hrace, bfe_hrac_budovy.ID_hrace

(o seřazení mi teď nejde) problém je v tom že v bfe_hrac_budovy má každý hráč 20 záznamu ve kterých jsou různé hodnoty pracujících nevolníků.
Jenže jakoby GROUP BY pro tu tabulku bfe_hrac_budovy nebyl a ten COUNT a SUMy sčítají 20krát stejnou hodnotu, takže místo populace 20 mi to vypisuje 400.

Opravte mě nebo mě nakopněte, děkuji.
Joker
Profil
Work:
Proč se seskupuje podle kombinace dvou ID hráče z různých tabulek?
Work
Profil
Joker:
bfe_hrac_mesta mají uživatele svá města, to seskupuji kvůli počtu měst hráče a počtu nezaměstnaných nevolníku
bfe_hrac_budovy mají uživatele budovy (20 budov na jedno město) a snažím se je seskupit abych spočítat kolik mají zaměstnaných (v budovách) nevolníků
Joker
Profil
Work:
Přijde mi ale zbytečné seskupovat podle kombinace těch IDček, navíc když je vazební podmínka, že musejí být stejná.
Nejjednodušší by mi přišlo seskupovat podle bfe_hrac.ID.

Ale to nebude příčina problému, příčina je, že tohle vybere všechny kombinace měst a budov pro daného hráče.
GROUP BY to sice seskupí podle ID hráče, ale SUM a COUNT počítají to uvnitř GROUP BY, takže počítají vícekrát stejné řádky.
Work
Profil
Joker:
Aha, a jak by se to dalo napravit. Tak aby výstup byl počet měst hráče a celkový počet nevolníku hráče?
Work
Profil
No tak jsem to nakonec vyřešil vnořeným dotazem, ale díky za ochotu.
Kajman_
Profil *
Také se dají připojit již zgroupovaná data...

SELECT bfe_hrac.nick, bfe_hrac.ID, bfe_hrac.ID_narod, ifnull(m.pocet,0), ifnull(m.nev,0)+ifnull(b.nev,0) 
FROM bfe_hrac 
LEFT JOIN (select ID_hrace, sum(nev) nev from bfe_hrac_budovy group by ID_hrace) as b ON bfe_hrac.ID = b.ID_hrace 
LEFT JOIN (select ID_hrace, sum(nev) nev, count(*) pocet from bfe_hrac_mesta group by ID_hrace) as m ON bfe_hrac.ID = m.ID_hrace
Work
Profil
Kajman:
Taky pěkné a pro mě nové. (opravdu jsem to vyzkoušel a tu chybu opravil :) ) Děkuji
Lamicz
Profil
Kajman:
jsi fakt šílenec, jsem ani nevěděl, že toto jde napsat... ;)

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: