Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Grupowanie warunkowe?
alekto
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 10.06.2013

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


Cześć,

Mam taką tabelę (nazwijmy ją 'zamowienia'):

ID_klienta / item
1 jablko
1 sliwka
1 gruszka
2 gruszka
3 jablko
3 sliwka
4 gruszka
4 gruszka


Chcę wyciągnąć z tej tabeli tylko takich klientów, którzy nie mają w swojej historii zamówień ani jednej gruszki (IMG:style_emoticons/default/wink.gif) jak to zrobić?

select id_klienta
from zamowienia
group by id_klienta

pytanie pewnie szokujaco proste, ale nie bylo mi do tej pory potrzebne takie zapytanie i niestety utknelam.. z gory dzieki.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
pmir13
post
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


  1. SELECT ID_klienta, SUM(CASE WHEN item='gruszka' THEN 1 ELSE 0 END) gruszek
  2. FROM zamowienia
  3. GROUP BY ID_klienta
  4. HAVING gruszek = 0


W ten sposób widać o co chodzi, można oczywiście zapisać to prościej, np:

  1. SELECT ID_klienta
  2. FROM zamowienia
  3. GROUP BY ID_klienta
  4. HAVING SUM(item='gruszka')=0


Ten post edytował pmir13 11.06.2013, 02:48:43
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #3





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

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


Można to zrobić jeszcze prościej (bardziej intuicyjnie - dosłownie tłumacząc zdanie z polskiego)
  1. SELECT * FROM klienci WHERE NOT EXISTS(SELECT ID_Klienta FROM zamowienia WHERE item='gruszka')

Podaj mi dane klientów, których brak w zbiorze klientów, którzy zamówili gruszki...
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@mmmmmmm:
Nie wiem czy to nie będzie wydajniejsze:

  1. SELECT * FROM klienci WHERE id NOT IN (SELECT id_klienta FROM zamowienia WHERE item='gruszka')


no i w takim przypadku masz faktycznie "których brak w zbiorze klientów". Należałoby sprawdzić empirycznie czy szybszy będzie NOT EXISTS czy NOT IN.
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #5





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

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


Fakt - moja pomyłka. Miało byc NOT IN, a nie EXISTS
Go to the top of the page
+Quote Post
alekto
post
Post #6





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 10.06.2013

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


Cytat(phpion @ 11.06.2013, 11:46:46 ) *
@mmmmmmm:
Nie wiem czy to nie będzie wydajniejsze:

  1. SELECT * FROM klienci WHERE id NOT IN (SELECT id_klienta FROM zamowienia WHERE item='gruszka')


no i w takim przypadku masz faktycznie "których brak w zbiorze klientów". Należałoby sprawdzić empirycznie czy szybszy będzie NOT EXISTS czy NOT IN.


Dzięki, to było bardzo pomocne. NOT IN lepiej się sprawdził.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 25.08.2025 - 06:50