Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Grupowanie warunkowe?
Forum PHP.pl > Forum > Bazy danych > MySQL
alekto
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 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.
pmir13
  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
mmmmmmm
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...
phpion
@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.
mmmmmmm
Fakt - moja pomyłka. Miało byc NOT IN, a nie EXISTS
alekto
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ł.
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.