Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zliczanie ilosci rekordow dla rodzica
Forum PHP.pl > Forum > Bazy danych > MySQL
maciu
Mam 2 tabele

kategorie
id | nazwa | id_rodzic
1 | nazwa1 | 0
2 | nazwa2 | 1
3 | nazwa3 | 1
4 | nazwa4 | 0
5 | nazwa5 | 4

kategorie_wpis
id | id_kategoria
1 1
2 2
3 2
4 3
5 5

Teraz chciałbym zliczyć ilość rekordów w tabeli kategorie_wpis gdzie id_kategoria jest równa id przodka danego rodzica. czyli np. kategoria o id 1 ma dwóch przodków (id 2 i 3) i teraz chcę zliczyć ilość rekordów w tabeli kategorie_wpis gdzie id_kategoria równa się 2 lub 3 (czyli id przodków kategorii 1). Z tym, że parametrem jaki znamy przy wyszukiwaniu jest id rodzica, id przodków musimy wybrać w zapytaniu.

Czy da się to zrobić w jednym zapytaniu?
nospor
  1. SELECT count(kw.id) FROM kategorie k
  2. LEFT JOIN kategorie_wpis kw ON kw.id_kategoria=k.id
  3. WHERE k.id_rodzic=1

pisane z palca
maciu
dziękuje nospor, dokładnie o to chodziło.

A dałoby się zrobić tak, aby zapytanie zwracało tablice kategorii rodziców i ilość rekordów ich potomków(według tej samej zasady co poprzednio)
nospor
oczywiscie:
  1. SELECT count(kw.id), k.id_rodzic FROM kategorie k
  2. LEFT JOIN kategorie_wpis kw ON kw.id_kategoria=k.id
  3. GROUP BY k.id_rodzic
maciu
niestety nie jest dobrze. Nie pobiera kategorii rodziców, tylko przodów, ale za to dobrze zlicza ilość wpisów przodków
nospor
Podaj na przykladzie co chcesz osiągnac bo chyba nie jarze
maciu
tablica jaką bym chciał otrzymać w tym zapytaniu to:

id | nazwa (tylko kategorie rodzice) | suma rekordów dla rodzica i jego dzieci
1 | nazwa1 | 4
4 | nazwa4 | 1
nospor
no to to zapytanie co dostales robi wlasnie prawie to winksmiley.jpg Wystarczylo tylko lekka modyfikacja:
  1. SELECT count(kw.id), k.id_rodzic FROM kategorie k
  2. LEFT JOIN kategorie_wpis kw ON kw.id_kategoria=k.id
  3. WHERE k.id_rodzic >0
  4. GROUP BY k.id_rodzic


A jeśli jeszcze chcesz miec nazwe id_rodzica to:
  1. SELECT count(kw.id), k2.nazwa,k.id_rodzic FROM kategorie k
  2. LEFT JOIN kategorie k2 ON k.id_rodzic = k2.id
  3. LEFT JOIN kategorie_wpis kw ON kw.id_kategoria=k.id
  4. WHERE k.id_rodzic >0
  5. GROUP BY k.id_rodzic

Pisane jak zwykle z palca
maciu
nospor jesteś wielki snitch.gif

To rozwiązanie ma tylko jedną wadę. Nie pobierze rodziców, którzy nie mają dzieci. Dla moich potrzeb w żadne sposób to nie koliduje, ale chciałem na to zwrócić uwagę jako ciekawostkę.
nospor
Cytat
To rozwiązanie ma tylko jedną wadę. Nie pobierze rodziców, którzy nie mają dzieci. Dla moich potrzeb w żadne sposób to nie koliduje, ale chciałem na to zwrócić uwagę jako ciekawostkę.


  1. SELECT count(kw.id), k2.nazwa,k.id_rodzic FROM kategorie k2
  2. LEFT JOIN kategorie k ON k.id_rodzic = k2.id
  3. LEFT JOIN kategorie_wpis kw ON (kw.id_kategoria=k.id AND k.id IS NOT NULL)
  4. GROUP BY k2.id

bodajze tak
smile.gif
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.