我正在尝试在MySQL中加入3个表,需要一些帮助。
我的第一张表是食谱清单。
general.appname.override
第二个表是分配给食谱表的成分列表
**recipes**
RecipeID | RecipeName
1 | Cheese and Ham Toasty
2 | 20 Minute Pasta
3 | Minute Steak
第三个表是一个表,用户可以使用它来添加他们不想看到食谱的成分,现在只为用户提供一种成分
**ingredients**
RecipeID | IngredientID | IngredientName
1 | 1 | Cheese
1 | 2 | Bread
1 | 3 | Ham
1 | 4 | Butter
2 | 5 | Pasta
2 | 6 | Mince
2 | 1 | Cheese
3 | 8 | Steak
3 | 9 | BBQ Sauce
加入表格时的结果如下:
**usersList**
IngredientID | userID
1 | 2
然而,我的结果是我不想要的所有食谱或空结果。下面是我正在使用的MySQL,它目前为我提供了我不想要的所有食谱。
**recipes**
RecipeID | RecipeName
3 | Minute Steak
如何加入这些表格,以便我获得所有不包含任何含有用户列表成分的食谱的食谱,如果用户没有列出成分,仍会提供结果?在此先感谢您的帮助。
答案 0 :(得分:3)
You are not looking for a join. You want to see recipes for which not exists a certain ingrediant. So select from the recipes table and limit the results with NOT EXISTS
or NOT IN
in the WHERE
clause. Here is a simple solution with two IN
clauses:
select *
from recipes
where recipeid not in
(
select recipeid
from ingredients
where ingredientid in
(
select ingredientid
from userslist
where userid = 2
)
);
答案 1 :(得分:0)
在配方和成分之间使用内部联接,在成分和用户列表之间使用左联接,然后在排除结果中,从用户列表返回的主键不为空。
此输出将包含多个配料的多个条目 - 可能需要整理....
SELECT recipename, GROUP_CONCAT(ingredient_name),
SUM(IF(userlist.ingredientid IS NULL, 0, 1))
FROM recipes
INNER JOIN ingredients
ON recipes.recipeid=ingredients.ingredientid
LEFT JOIN userlist
ON ingredients.ingredientid=userlist.ingredientid
AND userlist.userid=_______
GROUP BY recipename
HAVING SUM(IF(userlist.ingredientid IS NULL, 0, 1))=0
答案 2 :(得分:0)
您也可以按如下方式使用左连接:
select r.RecipeID, r.RecipeName from recipes r
left join (select RecipeID from ingredients i
join usersList u on u.RecipeID = i.RecipeID) as u
on u.RecipeID = r.RecipeID
where u.RecipeID is null