Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Złożone zapytanie z funkcją COUNT
Forum PHP.pl > Forum > Bazy danych > MySQL
camikazee
Witam!

Męczę się aby poprawnie wyjąć dane z trzech tabel.
Tabele, które biorą udział w zapytaniu:
- firmy
- branże
- komentarze
- referencje

Standardowe połączenie, firma należy do branży, może posiadać (lub nie) komentarze i referencje.
Teraz pytamy:

  1. SELECT firma.*, branzab.*, COUNT(ref.firmid) AS referencje, COUNT(kom.firmid) AS komentarze
  2. FROM branze_przydzial AS branzaf, branze_nazwy AS branzab, firma AS tablica_firm
  3. LEFT JOIN rerefencje AS ref ON firma.firmid = ref.firmid
  4. LEFT JOIN komentarze AS kom ON firma.firmid = kom.firmid
  5. WHERE firma.firmid = branzaf.firmid
  6. AND branzaf.id_br = branzab_id_br


Wynik taki, że uzyskuję tablicę asocjacyjną ale w komórkach referencje i komentarze są nieprawidłowe dane.
Chciałbym pobrać tablicę z firmami, branżami oraz ilością komentarzy i referencji.
osiris
jesli dobrze rozumiem schemat bazy to bedzie tak:
  1. SELECT f.*, b.*, IF r.ile IS NULL THEN 0 ELSE r.ile AS referencje, IF k.ile IS NULL THEN 0 ELSE k.ile AS komentarze
  2. FROM firma AS f INNER JOIN branza AS b ON f.id_branzy = b.id_branzy
  3. LEFT JOIN (SELECT firmid , COUNT(*) AS ile FROM referencje GROUP BY firmid) AS r ON r.firmid = f.id
  4. LEFT JOIN (SELECT firmid , COUNT(*) AS ile FROM komentarze GROUP BY firmid) AS k ON k.firmid = f.id


Pozdrawiam
camikazee
Próbowałem na różne sposoby, ale ciągle jest błąd wskazywany na procedurę z IFami., gdy je wykluczam, to wydobywa dane tyle że na końcu mam ORDER BY (referencje+komentarze) DESC, by sortowanie było malejąco po sumacyjnej wartości referencji i komentarzy. I tu się pojawia problem gdy wartością jest NULL. Do tego miejsca ładnie sortuje potem NULL i 1 jest poniżej samych NULL, gdzie teoretycznie suma powinna wynieść 1.


Zrobiłem funkcją CASE i działa smile.gif Nie wiem dlaczego IFem nie chce. Ogólnie odnosząc się do Twojego przykładu początek zapytania wygląda tak:

  1. SELECT f.*, b.*,
  2. CASE
  3. WHEN r.ile IS NULL THEN 0
  4. ELSE r.ile
  5. END AS referencje,
  6. CASE
  7. WHEN k.ile IS NULL THEN 0
  8. ELSE k.ile
  9. END AS komentarze
  10. FROM...


smile.gif
osiris
No tak, zapomnialem ze IF w MySQL jest funkjca. wiec poczatek zapytania wygladalby tak:
  1. SELECT f.*, b.*, IF(r.ile IS NULL, 0, r.ile) AS referencje , IF(k.ile IS NULL, 0, k.ile) AS komentarze
  2. FROM ...
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.