Mi się wydaje że jest to bardziej złożony problem.
Z tego co zrozumiałem, to kolega chce podawać do zapytania produkty ( id produktów ) i w wyniku mają być zwrócone wszystkie potrawy, które zawierają tylko i wyłącznie podane produkty.
Zakładając takie dane wejściowe:
CREATE TABLE produkty
(
idProduktu int,
nazwa varchar(255)
);
CREATE TABLE potrawy
(
idPotrawy int,
opis varchar(255)
);
CREATE TABLE skladnikiPotraw
(
idPotrawy int,
idProduktu int,
ilosc int
);
INSERT INTO produkty
SELECT 1, 'prod 1'
UNION
SELECT 2, 'prod 2'
UNION
SELECT 3, 'prod 3'
UNION
SELECT 4, 'prod 4'
UNION
SELECT 5, 'prod 5'
UNION
SELECT 6, 'prod 6'
INSERT INTO potrawy
SELECT 1, 'potr 1'
UNION
SELECT 2, 'potr 2'
UNION
SELECT 3, 'potr 3'
UNION
SELECT 4, 'potr 4'
UNION
SELECT 5, 'potr 5'
UNION
SELECT 6, 'potr 6'
INSERT INTO skladnikiPotraw
SELECT 1, 1, 12
UNION
SELECT 1, 2, 12
UNION
SELECT 1, 3, 12
UNION
SELECT 2, 1, 45
UNION
SELECT 2, 2, 10
UNION
SELECT 2, 3, 5
UNION
SELECT 2, 4, 18
UNION
SELECT 3, 5, 3
UNION
SELECT 3, 6, 7
UNION
SELECT 3, 1, 4
UNION
SELECT 6, 1, 5
UNION
SELECT 6, 2, 1
i taki warunek na wymagane produkty ( Jako że bawię się w konsoli, to zrobiłem sobie tabelę z id wymaganych produktów. Docelowo id mogą być przekazywane jako tablica w parametrze funkcji):
CREATE TABLE produkty_wymagane
(
id_produktu int
)
INSERT INTO produkty_wymagane
SELECT 1
UNION
SELECT 2
to wynikiem powinna być tylko i wyłącznie potrawa ID
6Wykombinowałem sobie takie zapytanie:
SELECT *
FROM potrawy potr
JOIN skladnikiPotraw sklad ON sklad.idPotrawy=potr.idPotrawy
JOIN (
SELECT sp.idPotrawy, count(*) AS iloscProduktow
FROM skladnikiPotraw sp
WHERE
sp.idProduktu IN(SELECT * FROM produkty_wymagane) -- ograniczenie na id produktów
AND sp.idPotrawy NOT IN(
SELECT idPotrawy
FROM skladnikiPotraw
WHERE
idPotrawy=sp.idPotrawy
AND idProduktu NOT IN(SELECT * FROM produkty_wymagane)) -- ograniczenie na ilość produktów w potrawach
GROUP BY sp.idPotrawy
HAVING count(*) >= (SELECT count(*) FROM produkty_wymagane)
) AS skladProd
ON skladProd.idPotrawy=potr.idPotrawy
JOIN produkty prod ON prod.idProduktu=sklad.idProduktu
Czy o takie coś koledze chodziło

?
Jeżeli tak, to losowanie potraw 3 x 21 nie powinno już być problemem.