SQL select upit

Pozdrav, molim malu pomoć oko jednog vjerovatno jednostavnog SQL upita.

Imam tablicu ITEMS sa poljima (itemID,childID,childValue)

Znači, jedan item može imati više pridružene djece.
Sada treba dohvatiti sve iteme koji imaju djecu recimo 7 i 15. No osim itemID-a, treba dohvatiti i childValue koji se nalazi uz childID.

Ja to znam napraviti na sljedeći način:

"SELECT itemID FROM items WHERE childID=7 and itemID in (SELECT itemID FROM items WHERE childID=15)";

To je znači prvi korak da dohvatim iteme koji imaju djecu 7 i 15.
A sada moram raditi još dodatno dohvaćanja da za svaki par (itemID,childID) da dohvatim traženi childValue.
Jel se nebi to moglo nekako sve odjednom?

SELECT * FROM ITEMS WHERE childID IN (7, 15);
ako sam dobro skuzio sto zelis.

Ili mozda:
SELECT itemID, childValue FROM ITEMS WHERE childID IN (7, 15);

Možda ovo?

SELECT itemID, childvalue
FROM ITEMS
WHERE itemID IN (SELECT itemID FROM ITEMS WHERE childID = 7)
AND itemID IN (SELECT itemID FROM ITEMS WHERE childID = 15)

Pomoglo bi kada bi napisao o čemu se konkretno radi jer ovo je dosta nejasno, barem meni.

Ne znam da li se zeli postici hijerarhija podataka, ali tada treba promijeniti strukturu tabele. Odnosno dodatno treba ostavljati parent_id, a ne child_id.
U tom slucaju rjesenje se moze naci u ovim artiklima: Managing Hierarchical Data in MySQL, Storing Hierarchical Data in a Database.

Tablica izgleda recimo
(itemID, childID, childValue)
2,7,'value1’
2,15,'value2’
3,15,'value3’
5,7, ‘value4’

Jedini itemID koji ima djecu i 7 i 15 je item 2.
Dohvaćanja po ideji:
SELECT itemID, childValue FROM ITEMS WHERE childID IN (7, 15);

…ne valja, zato jer će dohvatiti i one iteme koji imaju samo po jedno dijete iz skupa (7,15).

A u ovom slučaju je traženi odgovor (ako se dohvaća item koji ima djecu i 7 i 15):
itemID: 2 , value at childIDs: (value1, value2).

Ovo bi moglo raditi. Checkiram.

EDIT: falilo je još nešto.

SELECT itemID, childvalue
FROM ITEMS
WHERE itemID IN (SELECT itemID FROM ITEMS WHERE childID = 7)
AND itemID IN (SELECT itemID FROM ITEMS WHERE childID = 15)
AND childID IN (7,15)

Bez toga bi povuklo sve retke za trazeni itemID, tamo gdje su neka druga djeca…

To uglavnom radi, no baš me zanima što će reći brzina izvođenja spram mog prvog rješenaj koje sam razbijao u dva koraka. Sve mi se čini da dođe na isto…samo napisano u jednom upitu. Nadam se da se varam.

Nadao sam se da se varam…i dobro se nadao. Tvoje rješenje je brže čak 4.4 puta :slight_smile:
Fala!

Našao sam još jedno simpatično rješenje, kaže ovako:

SELECT x.itemID, x.childValue as val1, y.childValue as val2
FROM ruta_line_cvor as x
INNER JOIN ruta_line_cvor as y ON x.itemID=y.itemID
WHERE x.childID=7 and y.childID=15";

Ono što mi je draže u ovom rješenju, to je da sve rezultate dobijem u jednom komadu. Kod ovoga tvoga mi stižu pojedinačno dva rezultata iz baze za svaki itemID, za koje moram imati malu dodatnu logiku da to povežem…

No JOIN-i ipak nisu pobjednici, jer je tvoje duplo brže u izvođenju.
No nekako mi se čini da bi JOIN-i možda mogli imati i prenost s aspekta optimizacije ako se to možda može malo bolje posložiti?


Copyright © 2020 WM Forum - AboutContact - Sponsored by: Mydataknox & Profit Monkey