【发布时间】:2016-12-12 18:04:41
【问题描述】:
我有以下结构的数据库:
TABLE 成分(成分名称、颜色)
TABLE 食谱(recipe_name)
TABLE recipes_ingredients_parts(配方名称、成分名称、部分)
我想要的是获得与所选成分及其编号相对应的食谱。所以我首先尝试的是查询:
SELECT rr.* FROM
(SELECT r.* FROM receipes r
INNER JOIN receipes_ingredients_parts ri
ON r.receipe_name = ri.receipe_name
AND ri.ingredient_name = 'espresso'
AND ri.parts_number = '1') rr;
我得到的是 {"Americano", "Espresso"}。但这应该是“Espresso”,因为对于“Americano”应该有查询:
SELECT rr.* FROM
(SELECT r.* FROM receipes r
INNER JOIN receipes_ingredients_parts ri
ON r.receipe_name = ri.receipe_name
AND ri.ingredient_name = 'espresso'
AND ri.parts_number = '1') rr
INNER JOIN receipes_ingredients_parts ri
ON rr.receipe_name = ri.receipe_name
AND ri.ingredient_name = 'water'
AND ri.parts_number = '4';
接下来我的想法是更改配方表并为每种成分添加列以存储配方的数量。但它会接近 20 列这种类型。所以我很困惑,认为我的工作方式很糟糕。也许我应该为此目的使用一些好的查询?你们对所有的东西有什么想法吗?
【问题讨论】:
-
添加 20 列不会“优化”您的数据库结构。您的第一个查询是获取任何以“浓缩咖啡”为成分的食谱;您是否希望它获得以“浓缩咖啡”为唯一成分的食谱? (如果是这样,this 可能就是您正在寻找的答案。)
-
哦,是的,我想这也不太对;它为您提供包含列表中所有项目的事物,而不是事物仅包含列表中的项目。
标签: mysql