Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kategorie, wpisy w kategoriach i zliczanie wpisów.
Forum PHP.pl > Forum > Bazy danych > MySQL
mihaup
Heja,
mam podział na kategorie z wykorzystaniem Modified Preorder Tree Traversal ( left i right ), oraz powiazane z tymi kategoriamii pewne rekordy.

tabela kategorii:
kategorie (idKategorii, title, lft, rgt)

tabela z wpisami:
wpisy (idWpisu, title, content, idKategorii )

wszystko gra i buczy przy pobieraniu danych, ale nie wiem jak najwydajniej pobrac informacje o kategoriach ( standardowo mam:
  1. SELECT * FROM kat WHERE lft BETWEEN 1 AND 18 ORDER BY lft ASC;
)

tak, aby oprocz pol id, title, lft, rgt mieć jeszcze COUNT(ogloszenia.id) dla kazdej kategorii wliczajac wpisy w podkategoriach.

Oczywiscie moge to w foreach w php robic, ale nie chce sypac zapytaniami do bazy jak ziarnem do kur.

Jak narazie wykobinowalem takie cos:
  1. SELECT kat.title, COUNT( ogloszenia.id ) AS ile, kat.lft AS xlft, kat.rgt AS xrgt
  2. FROM ogloszenia, kat
  3. WHERE ogloszenia.categoryId
  4. IN (
  5.  
  6. SELECT kat.id
  7. FROM kat WHERE kat.lft
  8. BETWEEN xlft AND xrgt
  9. )
  10. GROUP BY kat.id


To produkuje mi tabele jakiej sie spodziewam, z wyjatkiem kategorii do ktorych nie sa przypisane zadne ogloszenia. Jak zmodyfikowac to zapytanie, aby uwzglednialo kategorie, w ktorych nie ma ogloszen?
JaRoPHP
Więc nie wiem, czy dobrze zrozumiałem problem: masz tabelę kategorie i wpisy, chcesz wyświeltić zawartość tabeli kategorie (wszystkie rekordy) + pole zliczające ilość wystąpień tej kategorii w tabeli wpisy?
Jeżeli tak, to przedstawione przez Ciebie zapytanie SQL nie działa poprawnie:
  1. SELECT kat.title, COUNT( ogloszenia.id ) AS ile, kat.lft AS xlft, kat.rgt AS xrgt
  2. FROM ogloszenia, kat
  3. WHERE ogloszenia.categoryId
  4. IN (
  5. SELECT kat.id
  6. FROM kat WHERE kat.lft
  7. BETWEEN xlft AND xrgt
  8. )
  9. GROUP BY kat.id
Uzupełnij tabelę (mnie wystarczyły po cztery rekordy w każdej...) i sie przekonaj.

Aby dokonać złączenia, wybierającego wszystkie rekordy z jednej tabeli, użyj składni LEFT [OUTER] JOIN.

Poniższa składnia SQL działa (oczywiście dla mojego zrozumienia przedstawionego problemu):
  1. SELECT kategorie.idKategorii, kategorie.title, count(wpisy.idKategorii) AS ilosc, kategorie.lft, kategorie.rgt
  2. FROM kategorie LEFT JOIN wpisy ON kategorie.idKategorii = wpisy.idKategorii
  3. GROUP BY (kategorie.idKategorii)
  4. HAVING lft BETWEEN 1 AND 18
  5. ORDER BY lft ASC

PS. Mam prośbę: jak piszesz o tabelach wpisy i kategorie, to trzymaj się tego nazewnictwa, a nie każ mi się domyslać, czy zapytanie SQL odnoszące się do tabeli ogłoszenia, jest tym samym, co odnoszące się do tabeli wpisy. No chyba, że to cos zupełnie innego...
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.