我在使用多对多关系类型进行SELECT / WHERE查询时遇到问题。用户输入成分,我想找到哪些配方使用 all 其他成分(如果有的话)中提供的成分。 (想一想:用完我冰箱里的最后成分)
我的数据库目前设计如下:
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 )
答案 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()
(如果它们以数组开头),并跳过子查询。
然后,您可以向外加入此列表以获取更多信息。