MySql 查询连接表

MySql query join tables

我的数据库中有以下表格:

菜肴

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)

但我得到了所有的菜,而不仅仅是顾客不过敏的菜。

我做错了什么?

您得到的是缺少的食材,而不是菜肴。

我会使用聚合来解决这个问题:

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 子句匹配 uaiHAVING 子句只是确定计数为零。

这听起来很连线,但您可以使用左联接 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

注意 WHERE 故意询问遗漏的行