[ Nuklearni Vojvoda @ 15.05.2008. 22:40 ] @
Radim supruzi neki zadatak iz sql-a za faks pa sam zapeo na jednom mestu. Imam 5 tabela ali navescu samo tri da ne bi komplikovao.
PISAC (JMBG,IME,PREZIME)
AUTOR(JMBG,KID)
KNJIGA (KID,ZANR,NASLOV)
E sad postoji pisac 'Pera Peric' koji je napisao ukupno dve knjige, jedna je zanr 'poezija' a druga 'roman'
Drugi pisac je 'Marko Markovic' koji je napisao ukupno dve knjige, obe su zanr 'poezija'.
Meni treba upit koji mi vraca samo Marka Markovica posto je deo zadatka da prikazem samo pisca koji pise SAMO poeziju, znaci ako je pisao jos neki zanr on mi ne treba.
ovo je deo podupita ali nisam dalje uspeo da nastavim:
Code:
select ime from pisac,autor,knjiga where pisac.jmbg=autor.jmbg and autor.kid=knjiga.kid and knjiga.zanr='poezije';

Ne mora ceo odgovor, samo neki hint da nastavim. Hvala unapred.
[ chachka @ 15.05.2008. 23:37 ] @
Tvoj upit vraća skup pisaca koji pišu poeziju. (prvi skup)

Napravi upit koji vraća skup pisaca koji pišu žanrove različite od poezije. (drugi skup)

Konačan odgovor je prvi skup bez drugog skupa.

[ Miloš Baić @ 16.05.2008. 16:16 ] @
Odokativno:
Code:

select t1.jmbg,
       t1.ime,
       t1.prezime
from   (select distinct p.jmbg,
                        p.ime,
                        p.prezime
        from  ((autor as a
                 inner join pisac as p
                   on a.jmbg = p.jmbg)
                inner join knjiga as k
                  on a.id_knjiga = k.id_knjiga)
        WHERE  k.zanr = 'POEZIJA') as t1,
       (select distinct a.jmbg
        from autor as a
               inner join knjiga as k
                 on a.id_knjiga = k.id_knjiga
        where  k.zanr <> 'POEZIJA') as t2
where  t1.jmbg <> t2.jmbg

[ Nuklearni Vojvoda @ 16.05.2008. 17:36 ] @
Milose nisam uspeo ono da implementiram posto mi ne ide bas dobro sql (jos), ali zasto mi ovo ne radi?

Code:

select ime from pisac as p1,autor as a1,knjiga as k1
where p1.jmbg=a1.jmbg and a1.kid=k1.kid and k1.zanr='poezije' and not exists 

(select ime from pisac as p2,autor as a2,knjiga as k2
where p2.jmbg=a2.jmbg and a2.kid=k2.kid and k2.zanr<>k1.zanr);



A sto se tice skupova nisam nasao minus kod mysql-a ne postoji pa sad idem da pokusavam sa left join posto ovo ne moze:

select ime from pisac,autor,knjiga where pisac.jmbg=autor.jmbg and autor.kid=knjiga.kid and knjiga.zanr='poezije' (minus)
select ime from pisac,autor,knjiga where pisac.jmbg=autor.jmbg and autor.kid=knjiga.kid and knjiga.zanr<>'poezije'

Hvala na trudu!
[ Miloš Baić @ 16.05.2008. 17:52 ] @
Aha, MySQL je u pitanju, probaj ovo:
Code:

select distinct p.jmbg,
                p.ime,
                p.prezime
from  ((autor as a
            inner join pisac as p
              on a.jmbg = p.jmbg)
            inner join knjiga as k
              on a.id_knjiga = k.id_knjiga)
where
  k.zanr = 'POEZIJA'
and p.jmbg not in 
      (select distinct a.jmbg
       from autor as a
        inner join knjiga as k
         on a.id_knjiga = k.id_knjiga
       where  k.zanr <> 'POEZIJA') 
[ Nuklearni Vojvoda @ 16.05.2008. 19:05 ] @
Sad radi ko zmaj idem da ga proucavam :-)
Fala!

al evo sad probah i ovo radi :
Code:

select ime from pisac ,autor,knjiga where pisac.jmbg=autor.jmbg and autor.kid=knjiga.kid and knjiga.zanr='poezije'
and
pisac.jmbg not in (select jmbg from autor inner join knjiga on autor.kid = knjiga.kid where knjiga.zanr <> 'poezije');


A gledam da bude sto prostiji kod prvo sto se ja ne razumem dovoljno a drugo treba ovo objasniti dalje osobi kojoj ovo jos slabije ide...

[Ovu poruku je menjao Vladimir Starcevic dana 16.05.2008. u 22:01 GMT+1]
[ Miloš Baić @ 16.05.2008. 21:57 ] @
Svaki problem, može se rešiti na više načina. Naravno, treba uvek tražiti najjednostavniji a da je ujedno i najkvalitetniji. Taj način razmišljanja stiče se vremenom i iskustvom. Primer sam predstavio, na brzinu u hodu, možda se pojavi neki post sa još jasnijim rešenjem.

Pozdrav.
[ chachka @ 16.05.2008. 22:28 ] @
Vladimire, ako hoćeš da ti upiti budu što jasniji onda se trudi da postigneš uniformnost u njihovom pisanju.

U glavnom upitu si tabele spajao u okviru WHERE klauzule, dok si u podupitu tabele spajao upotrebom JOIN-a. Ovo nikako ne doprinosi jednostavnosti. Odluči se za način na koji hoćeš da spajaš tabele i drži ga se. Neka to bude tvoja konvenicija sa samim sobom o načinu na koji se spajaju tabele. Naravno, to neisključuje potrebu da znaš i onaj drugi način spajanja.

Ja ti preporučujem da upotrebljavaš JOIN klauzulu za spajanje tabela jer se time jasno odvajaju uslovi po kojima se tabele spajaju od uslova po kojima se tabele filtriraju. Takođe ovaj način je moderniji i sve više se upotrebljava.

[ Nuklearni Vojvoda @ 17.05.2008. 11:55 ] @
Ok hvala vam ja sam pocetnik pa mi ovakvi komentari znace trudicu se da ih zapamtim.