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
子句匹配 uai
。 HAVING
子句只是确定计数为零。
这听起来很连线,但您可以使用左联接 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 故意询问遗漏的行
我的数据库中有以下表格:
菜肴
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
子句匹配 uai
。 HAVING
子句只是确定计数为零。
这听起来很连线,但您可以使用左联接 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 故意询问遗漏的行