如何通过单条MySQL查询,基于已有食材获取可制作菜品?
单条MySQL语句实现食材匹配菜品查询
可以用单条MySQL语句实现这个需求,核心思路是对比菜品所需的全部食材数和用户拥有的匹配食材数,当两者相等时,说明该菜品的所有食材用户都具备。
具体SQL语句
假设用户拥有的食材列表为['Pasta', 'Sauce'],对应的查询语句如下:
SELECT f.FoodName FROM Foods f -- 统计每道菜品需要的食材总数 JOIN ( SELECT FoodId, COUNT(*) AS total_ingredients FROM Foods_Ingredients GROUP BY FoodId ) fi_total ON f.FoodId = fi_total.FoodId -- 统计用户拥有的食材能匹配到每道菜品的数量 JOIN ( SELECT fi.FoodId, COUNT(*) AS matched_ingredients FROM Foods_Ingredients fi JOIN Ingredients i ON fi.IngredientId = i.IngredientId WHERE i.IngredientName IN ('Pasta', 'Sauce') GROUP BY fi.FoodId ) fi_matched ON f.FoodId = fi_matched.FoodId -- 筛选出所需食材全部被用户拥有的菜品 WHERE fi_total.total_ingredients = fi_matched.matched_ingredients;
逻辑说明
- 第一个子查询
fi_total:按菜品分组,计算每道菜品需要的食材总数量。 - 第二个子查询
fi_matched:关联食材表和关联表,筛选出用户拥有的食材对应的菜品,再按菜品分组计算匹配到的食材数量。 - 主查询通过对比两个子查询的数量,确保菜品的所有食材都被用户拥有,最终返回符合条件的菜品名称。
如果需要忽略食材名称的大小写差异,可以将WHERE条件改为:
WHERE LOWER(i.IngredientName) IN ('pasta', 'sauce')
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

