[ Kusur @ 29.07.2003. 13:25 ] @
Pozdrav svima

Muči me ovaj sql upit. Brojim koliko ima knjiga u svakoj oblasti.
Kako da prikažem i one oblasti koje nemaju knjige,
tj. da se prikaže i oblast i "nula" pored?

Da li neko može da mi pomogne?

SELECT DISTINCTROW oblasti.Oblast_ID, oblasti.Oblast_Ime, count(*) as broj
FROM oblasti inner join knjige on oblasti.Oblast_ID = knjige.Oblast_ID
GROUP BY oblasti.Oblast_ID

Unapred hvala
[ Nub.Saibot @ 29.07.2003. 13:54 ] @
Probaj ovako:

SELECT DISTINCTROW oblasti.Oblast_ID, oblasti.Oblast_Ime, count(*) as broj
FROM oblasti
RIGHT OUTER JOIN knjige on oblasti.Oblast_ID = knjige.Oblast_ID
GROUP BY oblasti.Oblast_ID

Pozdrav
[ Kusur @ 29.07.2003. 18:09 ] @
Dobijam isti rezultat, oblasti kod kojih je broj knjiga "0" se ne prikazuju.
[ Kusur @ 29.07.2003. 19:28 ] @
Rešio sam problem (treba gledati i druge diskusije :) )

Verovatno može i jednostavnije, ali ja sam rešio ovako:

SELECT DISTINCTROW oblasti.Oblast_ID, oblasti.Oblast_Ime,
count(oblasti.Oblast_ID = knjige.Oblast_ID) as broj
FROM oblasti left join knjige on oblasti.Oblast_ID = knjige.Oblast_ID
GROUP BY oblasti.Oblast_ID, oblasti.Oblast_Ime
ORDER BY Oblast_Ime

Izlista sve postojeće oblasti i izbroji broj knjiga u svakoj (uključujući i one sa "nula" knjiga)

Pozdrav
[ Last Man Standing @ 30.07.2003. 03:13 ] @
Citat:
Nub.Saibot:
Probaj ovako:

SELECT DISTINCTROW oblasti.Oblast_ID, oblasti.Oblast_Ime, count(*) as broj
FROM oblasti
RIGHT OUTER JOIN knjige on oblasti.Oblast_ID = knjige.Oblast_ID
GROUP BY oblasti.Oblast_ID

Pozdrav


Odakle ti samo ta hrabrost :)

1. Sta ce ti distinctrow?
2. count(*) daje pogresne rezultate u ovom slucaju cak i da je join OK
3. UVEK proveri da li u Group By imas sve kolone iz select-a (gore nedostaje ime oblasti)
4. Tabele su pomesane iliti join je obrnut. Kada imas dve tabele i hoces da iz tabele A dobijes sve redove, cak i ako ne postoje odgovarajuci u tablei B, pise se: From A LEFT OUTER JOIN B on ... Lako je da zapamtis, LEFT/RIGHT ti kaze na kojoj je strani tabela iz koje hoces SVE redove. Znaci mozes da koristis i RIGHT join, samo okreni tabele:

Evo onog sto se trazi:

Tabela A: id, name (id je key)
Tabela B: id, ... (id je foreign key iz A)

select A.name, count(B.id)
from A LEFT outer join B on a.id = b.id
group by A.name

Isto to:

select A.name, count(B.id)
from B RIGHT outer join A on b.id = a.id
group by A.name

count(nesto) daje broj redova u kome "nesto" nije null. Posto iz B dobijes null za id ako istog nema, broj redova ce biti 0. Distinct mozes da stavis u count ako hoces broj razlcitih vrednosti.
[ Nub.Saibot @ 30.07.2003. 10:28 ] @
Kada sam video Kusur-ov upit i opis problema samo sam prepravio JOIN deo da bih ga naveo na pravi put. (A najverovatnije je da sam ga zbunio kada je video da upit ne radi :))

Glavno je da pravi odgovor stigao


Pozdrav

P.S. Tek sad kada bolje pogledam taj upit vidim kakva je nebuloza :))
[ Kusur @ 30.07.2003. 10:52 ] @
A šta se dešava sa mojim "rešenjem" – LEFT JOIN ,
da li je "ispravan" to jest, da li prikazuje ispravne rezultate - meni se čini da je OK.
Koji su vaši komentari? Prvi put sam zaboravio, GROUP BY Oblast_Ime, koja postoji na mojoj "mašini".

SELECT DISTINCTROW oblasti.Oblast_ID, oblasti.Oblast_Ime, count(oblasti.Oblast_ID = knjige.Oblast_ID) as broj
FROM oblasti left join knjige on oblasti.Oblast_ID = knjige.Oblast_ID
GROUP BY oblasti.Oblast_ID, oblasti.Oblast_Ime
ORDER BY Oblast_Ime

[ Last Man Standing @ 31.07.2003. 02:35 ] @
Ako radi, onda OK.

Mozes da izbacis ono sto je suvisno: distinctrow i umesto count(oblasti.Oblast_ID = knjige.Oblast_ID) stavi count(knjige.Oblast_ID).