WiruSSS
25.09.2010, 10:45:46
Witam
Mam 2 tabele, przykładowo:
`pomieszczenie` z kolumnami `id`, `parent_id`, `numer`
`zwierzaki` z kolumnami `id`,`nazwa`
pomieszczenia jak widać mogą zawierać mniejsze pomieszczenia `parent_id`
potrzebuję zrobić takie zapytanie żeby wybrać wszytkie pomieszczenia i policzyć ile w każdym z nich jest zwierzaków bezpośrednio i pośrednio
Przyjmijmy że mam pokój nr 1 w tym pokoju są pokoje nr 2 i nr 3 ...w samym pokoju nr 1 nie ma żadnego zwierzak w pokoju nr 2 są 2 a w pokoju nr 3 jet ich 5 więc chciałbym uzyskać taki wynik:
1,0,8 - czyli odpowiednio id pokoju, liczba zwierzaków z pokoju nr 1 bezpośrednio, liczba zwierzaków w pokoju pośrednio
Drugi przypadek mamy pokój nr 4 a w tym pokoju mamy pokoje nr 5 i 6, w pokoju nr 4 jest 10 zwierzaów a w mniejszych odpowiednio 2 i 4 więc chciałbym uzyskać wynik:
4,10,16 - czyli odpowiednio jak w poprzednim przykładzie.
da sie, to zrobić jednym zapytaniem bez podzapytań?
netmare
25.09.2010, 22:42:37
Mało danych dałeś do tego przykładu.
1. Czy mamy tylko jeden poziom zagnieżdżenia?
2. Czy jeżeli pokoje 2 i 3 są w pokoju 1 to powinny pojawić się na liście czy tylko pokój 1 z wartościami "pośrednią" i "bezpośrednią" ?
3. Co jest wpisywane w kolumnie parent_id w pokoju nadrzędnym (np. pokój 1 z Twojego przykładu) ?
Bez tych informacji ciężko w ogóle zgadywać jakiego zapytania potrzebujesz i czy da się je napisać.
WiruSSS
26.09.2010, 05:15:24
na liście ma widnieć lista wszystkich pokoi, w parent_id pokoju głównego jest oczywiście standardowo 0 ..natomiast poziom zagnieżdżania nie sądzę aby miał jakiekolwiek znaczenie ..ale możemy przyjąć że będzie to tylko jeden poziom.
netmare
26.09.2010, 12:40:18
Wydawało się to dosyć proste dopóki nie okazało się że mają być wszystkie pokoje, a nie tylko te nadrzędne. Przy tych wymaganiach wydaje mi się niemożliwe rozwiązanie tego jednym zapytaniem.
Cytat
jest oczywiście standardowo 0
Wydaje mi się że jedni użyją standardowego 0, inni standardowego null-a a jeszcze inni standardowego parent_id = id

, ale oczywiście mogę się mylić.
Noidea
26.09.2010, 22:05:09
Nie dawało mi to spokoju, zrobiłem kilka prób i ... da się to zapisać w jednym zapytaniu:
SELECT p1.id,
COUNT( DISTINCT z1.id ) AS zwierzakow_w_glownym_pokoju,
COUNT( DISTINCT z1.id ) + COUNT( DISTINCT z2.id ) AS zwierzakow_lacznie
FROM pomieszczenie p1
INNER JOIN pomieszczenie p2 ON ( p1.id = p2.parent_id )
LEFT JOIN zwierzaki z1 ON ( p1.id = z1.room_id )
LEFT JOIN zwierzaki z2 ON ( p2.id = z2.room_id )
WHERE p1.parent_id = 0
GROUP BY p1.id
Nie wiem tylko czy wykorzystanie podzapytań nie uprościłoby tego
WiruSSS
26.09.2010, 22:49:50
...w sumie najważniejsze dla mnie jest niet oczy będą podzapytania tylko najwydajniejsze z możliwych zapytań

..niestety mnie nie działa to zapytanie ...być może gdzieś popełniłem błąd ..sprawdzę jeszcze dokładnie jutro.