我的数据库中有以下表格:
菜
id
name
用户
id
email
成分
id
name
dishes_ingredients (这用于表示菜肴和配料之间的关系)
id
dish_id
ingredient_id
users_allergic_ingredients (用户对某些成分过敏)
id
user_id
ingredient_id
鉴于某个用户(user_id),我需要获得用户不会过敏的所有菜肴。
我尝试了这个查询:
SELECT *
FROM dishes
JOIN dishes_ingredients
ON dishes.id = dishes_ingredients.dish_id
WHERE dishes_ingredients.ingredient_id NOT IN
(SELECT uai.ingredient_id FROM users_allergic_ingredients uai WHERE uai.user_id = 1)
但我得到了所有的菜肴,而不仅仅是顾客不会过敏的菜肴。
我做错了什么?
答案 0 :(得分:1)
你正在获得缺少的成分,而不是菜肴。
我会使用聚合来解决这个问题:
SELECT di.dish_id
FROM dishes_ingredients di LEFT JOIN
users_allergic_ingredients uai
ON uai.ingredient_id = di.ingredient_id AND
uai.user_id = 1
GROUP BY di.dish_id
HAVING COUNT(uai.integredient_id) = 0;
当用户对该成分过敏时,FROM
子句与uai
匹配。 HAVING
子句仅确定计数为零。
答案 1 :(得分:0)
听起来很有线,但你可以使用left join到users_allergic_ingredients,只获得连接的行没有成功。 像这样 -
SELECT D.name
FROM dishes D
INNER JOIN dishes_ingredients DI
ON D.id = DI.dish_id
LEFT OUTER JOIN users_allergic_ingredients UAI
ON UAI.user_id = @user_id
and UAI.ingridient_id = DI.ingridient_id
WHERE UAI.ingridient_id IS NULL
注意故意询问遗漏行的人