một cách khác nhau:
Phiên bản 2 (thủ tục như lưu trữ) sửa đổi
select r.name
from recipes r
where r.id = (select t1.recipe_id
from RecipeIngredients t1 inner join
RecipeIngredients t2 on t1.recipe_id = t2.recipe_id
and t1.ingredient_id = @recipeId1
and t2.ingredient_id = @recipeId2)
Chỉnh sửa 2: [trước khi mọi người bắt đầu la hét] :)
Điều này có thể được đặt ở đầu phiên bản 2, điều này sẽ cho phép truy vấn theo tên thay vì chuyển vào id.
select @recipeId1 = recipe_id from Ingredients where name = @Ingredient1
select @recipeId2 = recipe_id from Ingredients where name = @Ingredient2
Tôi đã thử nghiệm phiên bản 2 và hoạt động. Hầu hết người dùng nơi liên kết trên bảng Thành phần, trong trường hợp này là hoàn toàn không cần thiết!
Chỉnh sửa 3: (kết quả kiểm tra);
Khi quy trình lưu trữ này được chạy, đây là kết quả.
Kết quả là các định dạng (First Recipe_id; Thứ hai Recipe_id, quả)
1,1, Failed
1,2, 'banana cream pie'
1,3, 'chocolate banana surprise'
2,1, 'banana cream pie'
2,2, Failed
2,3, 'chocolate cream pie'
3,1, 'chocolate banana surprise'
3,2, 'chocolate cream pie'
3,3, Failed
Rõ ràng truy vấn này không xử lý trường hợp khi cả hai trở ngại đều giống nhau, nhưng hoạt động cho tất cả các trường hợp khác.
Sửa 4: (xử lý cùng hạn chế trường hợp):
thay thế dòng này:
r.id = (select t1...
để
r.id in (select t1...
làm việc với các trường hợp thất bại trong việc đưa ra:
1,1, 'banana cream pie' and 'chocolate banana surprise'
2,2, 'chocolate cream pie' and 'banana cream pie'
3,3, 'chocolate cream pie' and 'chocolate banana surprise'
fyi ... Các recipeIngredients được gọi là một MappingTable ... –
@Garis Suero: Có * rất nhiều * từ đồng nghĩa - xref, tra cứu, ánh xạ, liên kết - có định nghĩa tên chuẩn cho một bảng cung cấp mối quan hệ nhiều-nhiều . –