Autor | Zpráva | ||
---|---|---|---|
pcmanik Profil |
#1 · Zasláno: 30. 4. 2011, 19:23:52
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 |
#2 · Zasláno: 30. 4. 2011, 21:59:22
pcmanik:
znáš příkaz Union? :) |
||
pcmanik Profil |
#3 · Zasláno: 30. 4. 2011, 22:15:19
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 |
#4 · Zasláno: 30. 4. 2011, 22:49:27
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 |
#5 · Zasláno: 1. 5. 2011, 07:58:54
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 |
#6 · Zasláno: 1. 5. 2011, 12:18:51
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 |
#7 · Zasláno: 2. 5. 2011, 07:00:39 · Upravil/a: pcmanik
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 |
#8 · Zasláno: 2. 5. 2011, 10:36:06
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 |
#9 · Zasláno: 2. 5. 2011, 14:59:49
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 |
||
Časová prodleva: 13 let
|
0