MySql查询连接表

时间:2016-10-19 12:30:10

标签: mysql sql mariadb

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

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)

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

我做错了什么?

2 个答案:

答案 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

注意故意询问遗漏行的人