[ Prika @ 05.01.2005. 18:54 ] @
Stao mi je mozak kod jednog upita koji bi trebao biti jednostavan. Problem je sledeci:
Imam dve tabele: oblasti i dozvole. U jednoj se nalaze podaci o oblastima vesti (sport, vreme, vesti...), kolone su oblast_id, ime_oblasti i objasnjenje .U drugoj tabeli su dozvole autora. Tu se nalaze dve kolone: autor i ime_oblasti.
Kako glasi upit za ispis samo onih oblasti koje nisu dodeljene odredjenom autoru, a nalaze se u tabeli oblasti? Koristim MySQL bazu podataka.
Hvala!
[ GoranVucicevic @ 05.01.2005. 19:19 ] @
Ne radim na MySQL-u, ali je valjda:
Code:

SELECT oblast_id, ime_oblasti, objasnjenje 
FROM oblasti 
WHERE ime_oblasti NOT IN 
(SELECT ime_oblasti FROM dozvole WHERE autor = 'odredjen autor')
[ Prika @ 06.01.2005. 01:04 ] @
Ideja je prava, ali ....
MySQL mi izbacuje grešku 1064 syntax error!
Znači podržava subquery-je, ali mi javlja da se greška nalazi baš u tom subquery-ju. Kad pokušam da ga izvršim samostalno sve je ok!
UPIT IZGLEDA OVAKO:
SELECT * FROM oblast where ime_oblasti NOT IN ( SELECT ime_oblasti FROM dozvole_autora WHERE autor='mica');
Greška nije u pisanju jer sam pokušao da ručno navodim imena oblasti, i tad radi.
Odvojeno radi, a zajedno ne! ZAŠTO?
Zna li neko da uradi ovo sa JOIN naredbom, ako već ovako ne ide?
[ dragancesu @ 06.01.2005. 07:23 ] @
Tvoj upit

SELECT * FROM oblast where ime_oblasti NOT IN ( SELECT ime_oblasti FROM dozvole_autora WHERE autor='mica');

malo izmeni, ko sto ti covek napisa, umesto * navedi naziv polja, ovako je sql zbunjen jer dobije nekoliko polja da uporedjuje s jednim, to nije korektno
[ Prika @ 06.01.2005. 10:47 ] @
Probao sam i ovo,ali ne vredi!
@ dragancesu
Mislim da nije to u pitanju jer mi se zvezdica nalazila kod izdvajanja (ispisa) rezultata, a kod subquery-ja izdvajam samo to određeno polje ime_oblasti koje treba da se poredi sa kolonom u glavnom query-ju.
Kod greške mi prijavljuje da je problem samo u subquery-ju. Tako da glavni query ne stigne da obradi. To sam proverio, jer sam jednom namerno napravio grešku u glavnom query-ju, da bih video koji je redosled izvršavanja.
[ GoranVucicevic @ 06.01.2005. 10:56 ] @
Ne znam da li je to problem, ali vidim da imas jedan SPACE karakter pre SELECT naredbe u podupitu, a ako nije to onda probaj sa JOIN:
Code:

SELECT oblasti.oblast_id, oblasti.ime_oblasti, oblasti.objasnjenje 
FROM oblasti 
INNER JOIN 
(SELECT DISTINCT ime_oblasti FROM dozvole WHERE autor <> 'odredjen autor') AS OstaleOblasti 
ON oblasti.ime_oblasti = OstaleOblasti.ime_oblasti
[ Prika @ 06.01.2005. 14:47 ] @
Jednostavno neće!
Opet prijavljuje da je greška u podupitu u zagradi. Što se tiče onog SPACE-a... pokušao sam i sa njim i bez njega, velikim slovima, malim slovima ... NE REAGUJE!
Polako počinje da me nervira, a jako mi treba.
[ jablan @ 06.01.2005. 14:57 ] @
Copy paste ovde: 1) upit koji pokušavaš da izvršiš 2) grešku koju ti javlja
[ GoranVucicevic @ 06.01.2005. 18:11 ] @
Jesi proverio u svom upitu da li si tacno napisao nazive tabela i polja, posto si u postavljanju topica naveo da se tabele zovu "oblasti i dozvole", a kasnije u svom kodu ih navodis kao "oblast i dozvole_autora"?

Inace, kad smo vec kod toga, bilo bi dobro da ljudi koji se ovde obracaju za pomoc odvoje bar onoliko vremena i truda za opis problema, koliko mi sto zelimo da pomognemo potrosimo na resavanje.
[ jablan @ 06.01.2005. 21:14 ] @
Citat:
GoranVucicevic: Inace, kad smo vec kod toga, bilo bi dobro da ljudi koji se ovde obracaju za pomoc odvoje bar onoliko vremena i truda za opis problema, koliko mi sto zelimo da pomognemo potrosimo na resavanje.

Očigledno im odgovor nije dovoljno bitan.

Evo ja ne bejah lenj pa malo protrebih uputstvo za MySQL. U jednom delu, u vezi toga što MySQL ne podržava ugnježđene select-ove, kaže:
Citat:
The queries:

SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2 where table1.id=table2.id);

Can be rewritten as:

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL

Dakle, preformuliši tvoj upit u ovaj sa LEFT JOIN-om i trebalo bi da radi.
[ Prika @ 07.01.2005. 00:27 ] @
1: U početku nisam mislio da će se sve ovo ovoliko zakomplikovati, pa sam skratio ime tabele dozvole_autora u dozvole da ne bi komplikovali. A što se tiče tabele oblast, ono 'i' je bila greška kojom nisam hteo da vas smaram, jer sam je ispravljao dok sam pokušavao da odradim upite.
2: Preformulisan upit izgleda ovako:
SELECT oblast.* FROM oblast LEFT JOIN dozvole_autora ON oblast.ime oblasti=dozvole_autora.ime_oblasti WHERE dozvole_autora.autor IS NULL;
Kao rezultat dobijem oblasti koje nisu dodeljene ni jednom autoru. Ako nakon klauzule ... IS NULL dodam OR dozvole_autora.autor<>'mica';, dobijem i oblasti koje su dodeljene drugima. Znači ako tri autora imaju dozvolu nad vestima, vesti mi se ponove tri puta kao odgovor.
[ jablan @ 07.01.2005. 08:04 ] @
Code:
select * from oblasti o
left join dozvole d on d.oblast_id = o.oblast_id and d.autor = 'mica'
where d.autor is null

Dođeš pivo.

BTW, moderatori, ovo treba u MySQL podforum pošto je baš MySQL specific problem
[ Prika @ 07.01.2005. 18:05 ] @
Dođem ti i gajbu piva!!! Ma svima dođem po gajbu,a tebi dve. Nisi ni svestan koliki si mi problem rešio.
HVALA SVIMA KOJI SU MI POMOGLI!