Vì một công thức có thể sử dụng nhiều thành phần và bạn đang tìm kiếm công thức sử dụng một hoặc nhiều thành phần được chỉ định, bạn nên sử dụng DISTINCT
từ khóa để ngăn kết quả trùng lặp trong đó công thức sử dụng nhiều hơn một thành phần từ danh sách được chỉ định. Ngoài ra, bạn có thể sử dụng IN
mệnh đề để lọc trên nhiều ID thành phần.
select DISTINCT r.name
from
recipes r
inner join ingredient_index i
on i.recipe_id = r.recipe_id
where i.ingredient_id IN (7, 5);
Ngoài ra, nếu bạn đang tìm kiếm công thức nấu ăn sử dụng tất cả các thành phần được chỉ định trong danh sách, thì bạn có thể nhóm kết quả theo tên công thức và kiểm tra xem số lượng bản ghi có giống với số lượng nguyên liệu trong danh sách của bạn hay không.
select r.name
from
recipes r
inner join ingredient_index i
on i.recipe_id = r.recipe_id
where i.ingredient_id IN (7, 5)
GROUP BY r.name
HAVING COUNT(*) = 2
Điều này giả định rằng sẽ không có các bản ghi trùng lặp với cùng một bộ (công thức_id, thành phần_id) (được đảm bảo tốt hơn với ràng buộc DUY NHẤT).