MySQL SELECT查询具有多对多的关系

时间:2017-09-22 18:44:41

标签: mysql sql

我在使用多对多关系类型进行SELECT / WHERE查询时遇到问题。用户输入成分,我想找到哪些配方使用 all 其他成分(如果有的话)中提供的成分。 (想一想:用完我冰箱里的最后成分)

我的数据库目前设计如下: database structure recipes_ingredients看起来像这样 recipes ingredients

例如,如果我给,id_ingredient IN (22, 23)我只想要食谱#16497,而不是#16631(因为它只有22而不是23)。

我提出了与我所描述的相反的东西

SELECT DISTINCT recipes.*
FROM recipes_ingredients
JOIN recipes ON recipes_ingredients.id_recipe = recipes.id
WHERE id_ingredient IN ( 96, 13196 )

3 个答案:

答案 0 :(得分:1)

如果你想获得应该含有这两种成分(不是单一成分)的配方,那么你可以使用聚合和一些过滤器

jsondata

OR

main() {
  HttpRequest.getString('file.json').then((data) {
    jsondata = JSON.decode(data);
    print(jsondata);
  });
}

答案 1 :(得分:0)

假设您需要包含输入中所有成分的食谱,那么您可以使用JOIN

 SELECT recipes.* FROM recipes 
 JOIN recipes_ingredients r1 ON recipes.id = r1.id_recipe AND r1.id_ingredient = 96
 JOIN recipes_ingredients r2 ON recipes.id = r2.id_recipe AND r2.id_ingredient = 13192

不幸的是,mysql中没有相交运算符会更简单。

答案 2 :(得分:0)

SELECT count(*) matches, id_recipe FROM `recipes_ingredients`
WHERE `id_ingredient` in ('23',...)
Group By `id_recipe`
WHERE matches = (
    SELECT count(*) FROM ingredients where id in ('23',...)
);

这提供了每个配方的匹配成分的数量,然后将计数与传入的参数的确切数量进行比较。或者,由于您使用的是phpmyadmin(以及如此:PHP),您可以传入参数的计数(使用PHP的count()(如果它们以数组开头),并跳过子查询。

然后,您可以向外加入此列表以获取更多信息。