Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: 2 tabele wybrenie rekordów z jednej plus zliczenie rekordów z drugiej
Forum PHP.pl > Forum > Bazy danych > MySQL
WiruSSS
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
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
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
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 winksmiley.jpg, ale oczywiście mogę się mylić.
Noidea
Nie dawało mi to spokoju, zrobiłem kilka prób i ... da się to zapisać w jednym zapytaniu:
  1. SELECT p1.id,
  2. COUNT( DISTINCT z1.id ) AS zwierzakow_w_glownym_pokoju,
  3. COUNT( DISTINCT z1.id ) + COUNT( DISTINCT z2.id ) AS zwierzakow_lacznie
  4. FROM pomieszczenie p1
  5. INNER JOIN pomieszczenie p2 ON ( p1.id = p2.parent_id )
  6. LEFT JOIN zwierzaki z1 ON ( p1.id = z1.room_id )
  7. LEFT JOIN zwierzaki z2 ON ( p2.id = z2.room_id )
  8. WHERE p1.parent_id = 0
  9. GROUP BY p1.id


Nie wiem tylko czy wykorzystanie podzapytań nie uprościłoby tego
WiruSSS
...w sumie najważniejsze dla mnie jest niet oczy będą podzapytania tylko najwydajniejsze z możliwych zapytań smile.gif

..niestety mnie nie działa to zapytanie ...być może gdzieś popełniłem błąd ..sprawdzę jeszcze dokładnie jutro.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.