MySQL连接3个表,多个列不包括一个表的结果

时间:2018-01-09 15:19:52

标签: mysql join

我正在尝试在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

如何加入这些表格,以便我获得所有不包含任何含有用户列表成分的食谱的食谱,如果用户没有列出成分,仍会提供结果?在此先感谢您的帮助。

3 个答案:

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