Autor Zpráva
pcmanik
Profil
Zdravim, neviem si rady s mojim sql dotazom:

SELECT nazov, skratka, id_aliancie, predseda, stat, meno, 
(SELECT SUM(body) FROM uzivatelia u WHERE u.aliancia = a.id_aliancie) AS body, 
(SELECT SUM(zastavane + nezastavane) FROM budovy_produkcia bp WHERE bp.id = u.id AND u.aliancia = a.id_aliancie) AS rozloha, 
(SELECT COUNT(*) AS pocet FROM uzivatelia u WHERE u.aliancia = a.id_aliancie) AS clenovia 
FROM aliancia a, uzivatelia u 
WHERE a.predseda = u.id


Dostal som sa az potialto, ale na ten treti SELECT - SUM(zastavane + nezastavane)... potrebujem pouzit GROUP BY id_aliancie, lenze mysql nepovoluje pouzitie viacerych stplcov v tomto dotaze.
Vedel by mi prosim niekto poradit, ako to prerobit, popripade zjednodusit cely tento sql dotaz?

Dakujem.
Velda
Profil
pcmanik:
znáš příkaz Union? :)
pcmanik
Profil
Velda:
Hej poznam ho, aj ked som ho este nikdy nemusel pouzit, ale podla dokumentacie a po 15 minutovom snazeni sa mi to nepodarilo zfunkcnit.
Velda
Profil
pcmanik:
tak, když se ti to nepodařilo ten union, tak ukaž jak jsi ho zkoušel, ať ti můžem říct, co máš špatně :)
pcmanik
Profil
Velda:
Pokial viem union musi mat rovnaky pocet stlpcov, a to sa mi na tento konkretny pripad neda pouzit. Resp. vsetky moje pokusy boli zjavne na smiech a absolutne netusim ako to urobit :D Takze jedine kompletna rada mi pomoze :)
TomášK
Profil
UNION opravdu není to, co potřebuješ. Je jednodušší (a myslím, že i rychlejší, pokud to nevyjde nastejno) používat JOINY. Dotaz jsem příliš nezkoumal, ale vypadat to bude přibližně takto:
SELECT
 nazov, skratka, id_aliancie, predseda, stat, meno, 
 t1.pocet 
FROM 
 aliancia a
 JOIN uzivatelia u ON a.predseda = u.id
 JOIN (
   SELECT u.aliancia, COUNT(*) AS pocet FROM uzivatelia u GROUP BY aliancia
 )  t1 ON a.id_aliancie = t1.aliancia
 JOIN ...

Zjisti si také rozdíl mezi JOIN a LEFT JOIN, mohlo by se to hodit.
pcmanik
Profil
TomášK:
Diky, dotaz som si dokoncil a funguje tak ako ma :)

SELECT
 nazov, skratka, id_aliancie, predseda, stat, meno, 
 t1.pocet, t2.rozloha, t3.body
FROM 
 aliancia a
 JOIN uzivatelia u ON a.predseda = u.id
 JOIN (
   SELECT u.aliancia, COUNT(*) AS pocet FROM uzivatelia u GROUP BY aliancia
 )  t1 ON a.id_aliancie = t1.aliancia
JOIN (
   SELECT u.aliancia, SUM(zastavane + nezastavane) AS rozloha FROM budovy_produkcia bp, uzivatelia u WHERE bp.id = u.id GROUP BY aliancia
 )  t2 ON a.id_aliancie = t2.aliancia
JOIN (
   SELECT u.aliancia, SUM(body) AS body FROM uzivatelia u GROUP BY aliancia
 )  t3 ON a.id_aliancie = t3.aliancia


Ale zda sa mi vcelku komplikovany, teda ak by mal niekto nejaky navrch ako ho zjednodusit, resp. zrychlit budem rad.
TomášK
Profil
JOIN (
   SELECT u.aliancia, COUNT(*) AS pocet FROM uzivatelia u GROUP BY aliancia
 )  t1 ON a.id_aliancie = t1.aliancia
JOIN (
   SELECT u.aliancia, SUM(body) AS body FROM uzivatelia u GROUP BY aliancia
 )  t3 ON a.id_aliancie = t3.aliancia

jde spojit
JOIN (
   SELECT u.aliancia, COUNT(*) AS pocet, SUM(body) AS body FROM uzivatelia u GROUP BY aliancia
 )  t1 ON a.id_aliancie = t1.aliancia

V dotaze
 SELECT u.aliancia, SUM(zastavane + nezastavane) AS rozloha FROM budovy_produkcia bp, uzivatelia u WHERE bp.id = u.id GROUP BY aliancia

není potřeba tabulka uzivatelia:
 SELECT bp.id AS aliancia, SUM(zastavane + nezastavane) AS rozloha FROM budovy_produkcia bp GROUP BY id
pcmanik
Profil
TomášK:
Ta prva uprava funguje dobre, ale ta druha nieje dobra, musi byt takto:

SELECT aliancia, SUM(zastavane + nezastavane) AS rozloha FROM budovy_produkcia bp, uzivatelia u WHERE bp.id = u.id GROUP BY aliancia

inak to zle pocita tu rozlohu, resp. ju zapocina len od jedneho clena tej aliancie a nie od vsetkych

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