Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Zliczenie nawet jeśli nie istnieje rekord
Forum PHP.pl > Forum > Bazy danych > MySQL
Fred1485
Mając taką strukturę.




Takim zapytaniem wybiorę wszystkich klientów i zliczę ile zakupili w sumie produktów.

  1.  
  2. SELECT
  3. c.id,
  4. cd.name,
  5. cd.surname,
  6. COUNT(p.name) AS bought
  7. FROM shopping s
  8. JOIN client c ON s.client_id = c.id
  9. JOIN client_details cd ON c.id = cd.client_id
  10. JOIN product p ON s.product_id = p.id
  11. GROUP BY c.id;
  12.  


Pytanie jest pewnie banalne, ale czy wykorzystując złączenia mogę wyświetlić klientów oraz liczbę zakupionych produktów, ale danego typu, np chleb czy mąka tongue.gif

coś ala

  1.  
  2. SELECT
  3. c.id,
  4. cd.name,
  5. cd.surname,
  6. COUNT(p.name) AS bought
  7. FROM shopping s
  8. JOIN client c ON s.client_id = c.id
  9. JOIN client_details cd ON c.id = cd.client_id
  10. JOIN product p ON s.product_id = p.id
  11. WHERE p.name = 'Mąka'
  12. GROUP BY c.id;
  13.  


Takie coś działa tylko wyświetli ilość zakupionych produktów jeśli klient kupił chociaż 1 sztukę. Chciałbym żeby pojawili się wszyscy klienci, a ci co nie kupili to po prostu żeby widniało 0. Samymi złączeniami da się to zrobić?
viking
inner join zwraca tylko te rekordy, które istnieją w obu tabelach. Zobacz left/right join.
Fred1485
No właśnie próbowałem i left i right ale w każdym przypadku wynik jest identyczny.
trueblue
Ci co nie kupili, raczej nie spełnią warunku z WHERE, ten musisz przenieść do LEFT JOIN.
Fred1485
Ale nie rozumiem co ten left join w tym przypadku mi da i do którego złączania go dodać?
mmmmmmm
Musisz wyjść od klienta i połączyć LEFT JOINem z shopping. (Tak, wiem, że można RIGHT JOINem, ale po co sobie utrudniać...)
Fred1485
Poddaje się, jeszcze pewnie za wczesny etap nauki na takie skomplikowane (?) złączenia, ale spać mi to nie daje. Jeśli znajdzie się dobra dusza, co napisze takie zapytanie to stawiam 3 piwa w barze tongue.gif

Próbowałem jeszcze tak ale wynik identyczny j/w

  1.  
  2. SELECT
  3. c.id,
  4. cd.name,
  5. cd.surname,
  6. COUNT(p.id) AS ile
  7. FROM client c
  8. JOIN client_details cd ON c.id = cd.client_id
  9. LEFT JOIN shopping S ON c.id = S.client_id
  10. JOIN product p ON S.product_id = p.id AND p.name = 'Chleb'
  11. GROUP BY c.id;
  12.  
trueblue
Ostatni JOIN również jako LEFT 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.