Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: NVL w MySQLu jak to zrobic
Forum PHP.pl > Forum > Bazy danych > MySQL
mysz0n
witam mam takie pytanie do bazy

  1. SELECT k.id_statusu, count(k.id_statusu), s.id_statusu, s.nazwa_statusu
  2. FROM klienci k, statusy s
  3. WHERE k.id_statusu = s.id_statusu
  4. GROUP BY k.id_statusu


działa spoko, problem w tym, że statusów mam 5, a on wyświetla tylko 2 (ponieważ na chwile obecną tylko 2 są używane).
jak już w zapytaniu zrobić coś takiego, IF COUNT IS NULL to count(k.id_statusu) = 0
cos identycznego jak NVL w oraclu, czytalem cos o CASE - ale nie umiem zastosować :/
?
EarthCitizen
Nie jestem pewny, ale:
Kod
IF(k.id_statusu IS NULL, 0, COUNT(k.id_statusu)) AS ile
mysz0n
niestety takie cos:

  1. SELECT k.id_statusu, IF( k.id_statusu IS NULL , 0, COUNT( k.id_statusu ) ) AS ile, s.id_statusu, s.nazwa_statusu
  2. FROM klienci k, statusy s
  3. WHERE k.id_statusu = s.id_statusu
  4. GROUP BY k.id_statusu


nie działa, nie wyrzuca błędu, ale nie zwraca tez wierszy z cyferką 0 :/
kitol
może coś w ten deseń (pisane z palca):
  1. SELECT k.id_statusu, count(k.id_statusu), s.id_statusu, s.nazwa_statusu
  2. FROM statusy s
  3. LEFT JOIN klienci k ON k.id_statusu = s.id_statusu
  4. GROUP BY s.id_statusu
kefirek
Zobacz tak powinno dzialac
  1. SELECT k.id_statusu, count(k.id_statusu), s.id_statusu, s.nazwa_statusu,
  2. CASE count(k.id_statusu) WHEN 'NULL' THEN '0' ELSE count(k.id_statusu) END AS wynik
  3. FROM klienci k, statusy s
  4. WHERE k.id_statusu = s.id_statusu
  5. GROUP BY k.id_statusu


W kolumnie wynik masz liczbe 0 gdy jest NULL lub liczbe zliczoną przez count gdy nie jest null
mysz0n
nie działa, ale może wytłumaczę jeszcze jak ta baza u mnie wygląda - bo może zupełnie inaczej trzeba się za to zabrać.
mam tabele stausy a w niej ID_statusu | nazwa statusu (mam: 1,podłączony; 2,niepodłączony;3,zainteresowany;4odłączony) i tabele z klientami gdzie mam całą masę informacji w tym id_klienta i id_statusu. i teraz chciałbym sobie zrobić menu - w ktorym pokazałoby mi się że podłączonych mam 60 klientów, niepodłączonych 20, a zainsteresowanych 0 i odłączonych 0.
to zapytanie które na samym szczycie wkleiłem działa dobrze ale pomija te wartości (zainteresowany i odłączony) z tabeli statusy - które nie są przypisane żadnemu klientowi - wiec chyba nawet tego nie wyciąga z bazy. ale czy jest jakaś opcja zeby w tym samym zapytaniu wyciągnął to z bazy i napisał 0 ?
dr_bonzo
Pobierz statusy i counta i dolacz (LEFT JOIN) klientow i group po id statusu:

Lekko zmodyfikowany Kod @kitol'a powinien dzialac

  1. SELECT s.id_statusu, s.nazwa_statusu, count(k.id_statusu)
  2. FROM statusy s
  3. LEFT JOIN klienci k ON k.id_statusu = s.id_statusu
  4. GROUP BY s.id_statusu


to da ci 0 dla statusow dla ktorych brak klienta
mysz0n
dzieki dj_bonzo działa jak powinno, nie wiem dlaczego ale zawsze unikałem LEFT i RIGHT JOINów, zawsze robiłem tak jak pokazałem, ale widze ze będe się musiał także do tej metody przekonać.
jeszcze raz dzieki!
dr_bonzo
Twoja notacja to po prostu INNER JOIN, a potrzebujesz OUTERA (co daje ci LEFT/RIGHT JOIN)
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.