Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SOLVED] Join i warunek where
Forum PHP.pl > Forum > Bazy danych > MySQL
lukasz91
Mam tabelę product_user zawierającą product_id i user_id (relacja m do n).

Klient chce filtrowanie użytkowników po produktach. Jeżeli z selecta wybierze 2 produkty to na liście mają mu się pokazać tylko użytkownicy posiadający 2 produkty równocześnie.

Jak napisać do tego zapytanie? Z OR nie byłoby problemu, ale z AND nie mam pomysłu...
nospor
Musisz dac tyle LEFT JOIN na tabele product_user ile koles wybral produktow a potem w where dajesz warunek ze obie tabele mają miec product_id <> null i po sprawie smile.gif
mmmmmmm
SELECT user_id FROM product_user WHERE product_id in (id1,id2,id3,id4,...) GROUP BY user_id HAVING Count(DISTINCT product_id)=ILOSC_ID_Z_IN
nospor
Można i tak smile.gif
Swoją drogą ciekawe jak z wydajnością obu rozwiązań względem siebie.
lukasz91
Działa sposób zaproponowany przez @mmmmmmm. Dzięki wam za pomoc smile.gif
nospor
Ba, moj tez dziala, ino ze ja nie dalem kodu wink.gif
lukasz91
Cytat(nospor @ 6.08.2015, 12:35:18 ) *
Ba, moj tez dziala, ino ze ja nie dalem kodu wink.gif


Nie sprawdzałem. Zapytanie od @mmmmmm jest prostsze w zapisie. Klient nie posiada wielu produktów, a więc duża optymalizacja nie jest potrzebna smile.gif
nospor
Zgadza sie, jest prostsze w zapisie, chcoć w cale nie az tak duzo.
Co to optumalizacji jak kiedys bede mial czas i nie zapomne to z czystej ciekawosci porownam oba rozwiązania.
bobek358
Kiedyś testowałem, nie odnotowałem dużej różnicy w zastosowaniu IN vs Left Join - jednak każde zapytanie jest inne.
lukasz91
Odkopuję temat, ponieważ klient chce jeszcze to zmodyfikować. Może opiszę na przykładzie:

User 1 ma produkty A I B
User 2 ma produkt A

Przy filtrowaniu admin wybiera produkt A. Na liście wyników ma mu pokazać tylko Usera 2. User 1 ma nie pokazać się, ponieważ ma dodatkowo produkt B.

Na liście ma pokazywać tylko tych użytkowników, co mają dokładnie takie produkty jak wybrane z listy filtrowania.

Mój sql wygląda teraz tak:
  1. SELECT u.* FROM user u LEFT JOIN product_user pu ON(u.user_id=pu.user_id) WHERE 1=1 AND pu.product_id IN (1) AND pu.product_id NOT IN (2) GROUP BY pu.user_id HAVING Count(DISTINCT pu.product_id)=1 ORDER BY u.user_id DESC


ale kod nie działa tak jak trzeba. Jak go poprawić?
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.