[ zeljko b @ 17.02.2006. 19:40 ] @
Pitanje se odnosi na kreiranje select iskaza i povezivanje rezultata operatorom AND
Npr. postoje dve tabele: knjige i pisci, i treca asocijativna tabela koja spaja knjige i pisce:
knjiga1:pisac1
pisac2
pisac3
knjiga2:pisac1
pisac2
knjiga3:pisac1
pisac3
Kako dobiti knjige koju su napisali i pisac1 AND pisac2. Ovo sam uradio formiranjem 2 temporary tabele:
CREATE TEMPORARY TABLE t1 SELECT nazivKnjige FROM knjiga_pisac WHERE pisac=pisac1
CREATE TEMPORARY TABLE t2 SELECT nazivKnjige FROM knjiga_pisac WHERE pisac=pisac2
t1=knjiga1
knjiga2
knjiga3
t2=knjiga1
knjiga2
i zatim spajanjem ove dve tabele po istoj knjizi dobijam konacan rezultat: knjiga1 i knjiga2
Ovo mi deluje prilicno komplikovano. Zar ne?
[ Ana Komazec @ 17.02.2006. 21:12 ] @
Probaj ovako:

Select nazivKnjige
From Knjiga_pisac
Where pisac=pisac1 or pisac=pisac2
Group by nazivKnjige
Having Count(nazivKnjige)>1

Ovo je neki pokushaj bez kreiranja temporary tabela...Takodje OR umesto AND ali mozda radi...
Pozdrav

[Ovu poruku je menjao Ana Komazec dana 17.02.2006. u 22:13 GMT+1]
[ zeljko b @ 17.02.2006. 22:24 ] @
Radi u slucaju da ima samo jedano AND povezivanje ali ukoliko se to zeli sa n povezivanja onda ne radi. Upravo je to i razlog zasto sam odustao od privremenih tabela (jako se komplikuje proces)
[ zeljko b @ 17.02.2006. 22:38 ] @
Mada izgleda radi ako se u klauzuli having stavi count>n-1
gde je n broj izraza koji se povezuju operatorm AND
[ goranvuc @ 17.02.2006. 22:48 ] @
Mozda bi mogao da iskoristis Union:

Code:

SELECT nazivKnjige FROM 
(SELECT DISTINCT nazivKnjige FROM knjiga_pisac WHERE pisac=pisac1 
UNION 
SELECT DISTINCT nazivKnjige FROM knjiga_pisac WHERE pisac=pisac2) AS Naslovi 
GROUP BY nazivKnjige 
HAVING COUNT(nazivKnjige) = 2


a za tri pisca bi bilo:
Code:

SELECT nazivKnjige FROM 
(SELECT DISTINCT nazivKnjige FROM knjiga_pisac WHERE pisac=pisac1 
UNION 
SELECT DISTINCT nazivKnjige FROM knjiga_pisac WHERE pisac=pisac2 
UNION 
SELECT DISTINCT nazivKnjige FROM knjiga_pisac WHERE pisac=pisac3) AS Naslovi 
GROUP BY nazivKnjige 
HAVING COUNT(nazivKnjige) = 3


To je ideja, ako ne radi izvini, nije da sam probao, vec ja to onako :)
[ Ana Komazec @ 17.02.2006. 22:50 ] @

Citat:
Mada izgleda radi ako se u klauzuli having stavi count>n-1
gde je n broj izraza koji se povezuju operatorm AND


Pa da, ovo je bio primer ako se trazi zajednicka knjiga 2 pisca, za tri bi bilo Count(nazivKnjiga)>2 itd.
U svakom sluchaju, OR bi trebalo staviti umesto AND, bar je meni na slichnom primeru radilo.
Pozdrav

[Ovu poruku je menjao Ana Komazec dana 17.02.2006. u 23:53 GMT+1]
[ zeljko b @ 18.02.2006. 09:45 ] @
count(...) = n (lepse izgleda)
Hvala Ana
[ Ana Komazec @ 18.02.2006. 15:08 ] @
Citat:
count(...) = n (lepse izgleda)


Samo jedna napomena: Ukoliko stavish Count()=n, u rezultate ti nece uci knjige koje je pisao jos neki pisac sem trazenih. Npr. ukoliko su knjigu "Matematika" pisali Mika, Pera i Laza a u upitu ti stoji zahtev za prikazivanjem knjige koju su zajedno pisali Mika i Pera, kao i Count()=2, "Matematika" ti se nece prikazati u rezultatima jer je kod ove knjige Count()=3.
Znaci, sve zavisi od toga sta trazis. Count()=n je u redu samo ukoliko trazis knjigu koju su iskljucivo pisali Mika i Pera, i niko vishe.
U suprotnom, moze da stoji Count()>=n, da bi bile ukljucene i knjige koje imaju jos neke pisce osim navedenih.

Pozdrav