Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SOLVED] Join i warunek where
lukasz91
post 5.08.2015, 13:33:52
Post #1





Grupa: Zarejestrowani
Postów: 149
Pomógł: 7
Dołączył: 6.01.2010
Skąd: Opole Lubelskie

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


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...

Ten post edytował lukasz91 6.08.2015, 11:29:52


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
nospor
post 5.08.2015, 13:55:18
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mmmmmmm
post 5.08.2015, 14:18:41
Post #3





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

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


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
Go to the top of the page
+Quote Post
nospor
post 5.08.2015, 14:23:38
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Można i tak smile.gif
Swoją drogą ciekawe jak z wydajnością obu rozwiązań względem siebie.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
lukasz91
post 6.08.2015, 11:26:35
Post #5





Grupa: Zarejestrowani
Postów: 149
Pomógł: 7
Dołączył: 6.01.2010
Skąd: Opole Lubelskie

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


Działa sposób zaproponowany przez @mmmmmmm. Dzięki wam za pomoc smile.gif


--------------------
Go to the top of the page
+Quote Post
nospor
post 6.08.2015, 11:35:18
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Ba, moj tez dziala, ino ze ja nie dalem kodu wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
lukasz91
post 6.08.2015, 11:43:13
Post #7





Grupa: Zarejestrowani
Postów: 149
Pomógł: 7
Dołączył: 6.01.2010
Skąd: Opole Lubelskie

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


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


--------------------
Go to the top of the page
+Quote Post
nospor
post 6.08.2015, 11:48:46
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
bobek358
post 6.08.2015, 13:52:44
Post #9





Grupa: Zarejestrowani
Postów: 143
Pomógł: 22
Dołączył: 17.11.2007

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


Kiedyś testowałem, nie odnotowałem dużej różnicy w zastosowaniu IN vs Left Join - jednak każde zapytanie jest inne.
Go to the top of the page
+Quote Post
lukasz91
post 20.10.2015, 09:51:34
Post #10





Grupa: Zarejestrowani
Postów: 149
Pomógł: 7
Dołączył: 6.01.2010
Skąd: Opole Lubelskie

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


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


--------------------
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 Wersja Lo-Fi Aktualny czas: 22.06.2025 - 07:11