Wpis z mikrobloga

Cześć,

mam taką zagwostkę z SQL:
1. Mamy dwie tabele: Orders i Products
2. Tabela Orders ma kolumny:

id (autoincrement) / orderid / productid

3. Tabela Products ma kolumny:

id / name

4. W tabeli Orders zapisywane są zamówienia, gdzie każdy produkt w zamówieniu tworzy nowy rekord np. widok tabeli Orders:

1 / 1 / 10
2 / 1 / 15
3 / 1 / 17
4 / 2 / 5
5 / 2 / 7
....itd.
(productid ma oczywiście relacje do id w tabeli Products)

5. W tabeli Products może być n produktów, także zamówienie może składać się z n produktów, co stworzy n rekordów w tabeli Orders
6. Niestety nie ma opcji zmiany tego i taka logika na bazie musi zostać.

I teraz problem - jak stworzyć jedno uniwersalne zapytanie SQL, które pokaże zamówienia zawierające product X oraz Y oraz Z.
Zamówienie musi zawierać wszystkie wybrane w filtrze produkty, czyli jak ktoś wybierze 5 produktów to wyfiltruje tylko zamówienia gdzie wszystkie z tych 5 produktów były. Z filtra wpada tablica zawierająca 5 różnych product
id.

Może rozwiązanie jest banalne, ale mam mindfuck.

#sql #programowanie
  • 7
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

  • 1
@ch1nczyk: o dzięki, dokładnie tak to by było :) odpowiedź czata można nawet uprościć do:

SELECT a.order_id, count(a.id) as 'ile_produktów_z_wybranych' FROM
(SELECT * FROM Orders WHERE product_id in (1,2,3) ) as a
GROUP BY a.order_id
HAVING count(a.id) = 3
  • Odpowiedz