[ NenadS @ 23.12.2014. 09:42 ] @
Imam problem sa jednim upitom pa se nadam da ce neko imati vremena da mi pomogne da ga resim.

O cemu se radi. Dobio sam projekat za fax da napravim bazu za potrebe agencije za prodaju nekretnina.

Nekretnina moze da bude zemljiste, zgrada, stan, garaza ili nesto drugo.. .dakle, nije konacna lista.

Svaka od nekretnina moze da ima neke karakteristike, recimo za stan mozemo da imamo sprat, terasu, broj spav. soba, klimu, parking mesto recimo i ostalo... znaci isto nije konacna lista i za razlicit tip nekretnine mozemo da imamo razlicite karakteristike.

Ja sam to realizovao ovako:

- tabela nekretnina
- tabela tip nekretnina ciji se ID spusta u tabelu nekretnina

- tabela karakteristika koja ima samo naziv karakteristike
- tabela vrednost_karakteristike koja dobija ID nekretnine i IT karakteristike i ima polje u kome cuva konkretnu vrednost

Problem koji imam je da pronadjem recimo nekretninu koja ima terasu, klimu, parking mesto i koja se nalazi na spratu vecem od treceg.

Ovo je tabela koja cuva podatke o tim specificnim karakteristikama:




Dakle, u njoj kao sto sam rekao imam ID nekretnine, zatim ID karakteristike i vrednost karakteristike... ali ne mogu da napisem upit koji ce zadovoljiti gore pomenute uslove ili bilo koju kombinaciju... recimo da li ima kablovsku itd...

Ako upotrebim WHERE sa OR, on ce mi naci ako nekretnina ima bar jednu od trazenih karakteristika sto nije dobro, a ako upotrebim AND, onda nema rezultata.

Pokusavao sam nesto sa GROUP BY ID_NEKRETNINA i HAVING pa tu da nabrojim karakteristike ali dobijam info da takav having nije moguc.

Da li imate neko resenje za ovaj problem ili predlog kako da izmenim strukturu baze da bih mogao da uradim upit ali da to nije pravljenje onoliko kolona koliko karakteristika imam i za svaki tip karakteristike pravljenje posebne tabele... ili je to ipak jedino resenje?

[Ovu poruku je menjao NenadS dana 23.12.2014. u 11:23 GMT+1]
[ farmaceut @ 24.12.2014. 21:39 ] @
Ovo je nekakav EAV model.... Mozes ovo na vise nacina, evo jedan:
idi sa WHERE i OR, pa grupisi po ID_NEKRETNINA i odradi "COUNT".
Onda izaberi rezultate koji imaju "COUNT" jednak broju trazenih parametara.



Nesto ovako (pseudo kod):

Code:

SELECT id_nepokretnost, COUNT() AS br
FROM vrednost_karakteristike
WHERE 
vrednost_karakteristike=xxx
OR vrednost_karakteristike = yyy
OR vrednost_karakteristike = zzz
GROUP BY id_nepokretnost
HAVING  br = broj_parametara_u_where_uslovu

[ NenadS @ 24.12.2014. 22:36 ] @
Hvala ti puno!

Na osnovu tvoje ideje, napravio sam sledeci upit koji mi vraca zeljeni rezultat:


Code:
SELECT v.IME, v.ADRESA, v.TELEFON, n.DRZAVA, n.GRAD, n.ULICA, n.POVRSINA, n.CENA, tn.TIP_NEPOKRETNOSTI
FROM vlasnik AS v
JOIN nepokretnost AS n ON v.ID_VLASNIK = n.ID_VLASNIK
JOIN tip_nepokretnosti AS tn ON n.ID_TIP_NEPOKRETNOSTI = tn.ID_TIP_NEPOKRETNOSTI
JOIN nepokretnost_karakteristika AS nk ON n.ID_NEPOKRETNOST = nk.ID_NEPOKRETNOST
JOIN tip_nepokretnosti_karakteristika AS tnk ON nk.ID_TIP_NEPOKRETNOSTI_KARAKTERISTIKA = tnk.ID_TIP_NEPOKRETNOSTI_KARAKTERISTIKA
JOIN karakteristika AS k ON tnk.ID_KARAKERISTIKA = k.ID_KARAKERISTIKA
WHERE ((k.NAZIV_KARAKTERISTIKE = 'Terasa' AND nk.VREDNOST_KARAKTERISTIKE = 'Da')
OR (k.NAZIV_KARAKTERISTIKE = 'Parking mesto' AND nk.VREDNOST_KARAKTERISTIKE = 'Da')
OR (k.NAZIV_KARAKTERISTIKE = 'Klima' AND nk.VREDNOST_KARAKTERISTIKE = 'Da')
OR (k.NAZIV_KARAKTERISTIKE = 'Sprat' AND nk.VREDNOST_KARAKTERISTIKE > 3))
AND n.DRZAVA = 'Srbija'
AND n.GRAD = 'Niš'
AND n.POVRSINA > 50
GROUP BY n.id_nepokretnost
HAVING COUNT(*) = (SELECT COUNT(*) FROM karakteristika AS k WHERE k.NAZIV_KARAKTERISTIKE IN('Terasa', 'Parking mesto', 'Klima', 'Sprat'))


Hvala jos jednom, bas sam se namucio sa ovim :(

Sve najbolje!

[Ovu poruku je menjao NenadS dana 24.12.2014. u 23:48 GMT+1]