Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Zliczenie nawet jeśli nie istnieje rekord
Fred1485
post
Post #1





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

Ostrzeżenie: (0%)
-----


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ć?


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
viking
post
Post #2





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


inner join zwraca tylko te rekordy, które istnieją w obu tabelach. Zobacz left/right join.


--------------------
Go to the top of the page
+Quote Post
Fred1485
post
Post #3





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

Ostrzeżenie: (0%)
-----


No właśnie próbowałem i left i right ale w każdym przypadku wynik jest identyczny.


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
trueblue
post
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Ci co nie kupili, raczej nie spełnią warunku z WHERE, ten musisz przenieść do LEFT JOIN.


--------------------
Go to the top of the page
+Quote Post
Fred1485
post
Post #5





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

Ostrzeżenie: (0%)
-----


Ale nie rozumiem co ten left join w tym przypadku mi da i do którego złączania go dodać?


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #6





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


Musisz wyjść od klienta i połączyć LEFT JOINem z shopping. (Tak, wiem, że można RIGHT JOINem, ale po co sobie utrudniać...)
Go to the top of the page
+Quote Post
Fred1485
post
Post #7





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

Ostrzeżenie: (0%)
-----


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.  


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
trueblue
post
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Ostatni JOIN również jako LEFT JOIN.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 19:18