2

我有一个新爱好,叫做“把味道不好的利口酒变成好东西”,也就是“混合鸡尾酒”。

因为我是个书呆子,我不想在书中查找食谱,阅读配料表并注​​意到我缺少一些东西。相反,我想拥有一个包含我收集的所有食谱和配料的数据库,并让计算机告诉我可以用我目前在家中拥有的配料“构建”哪些食谱。为此,我有这两个表:

表 1:包含有关多对多关系的信息

recipe | ingredient
1      | 1          
1      | 2          
1      | 3          
2      | 1         
2      | 4          

表 2:该成分是否可用的信息

ingredient | available
1          | true
2          | true
3          | true
4          | false

我的问题对所有其他表都不感兴趣。

这两个表可以很容易地INNER JOIN组合ingredient = ingredients.id成一个大表,如下所示:

recipe | ingredient | available
1      | 1          | true
1      | 2          | true
1      | 3          | true
2      | 1          | true
2      | 4          | false

如果你看一下这个,你会注意到我可以混合配方 1,但不能混合配方 2,因为缺少一种成分。

我现在要做的是找到一种方法,使结果看起来像:

recipe | all_available
1      | true
2      | false

我已经找到了一种方法来检查某个食谱的所有成分是否可用:

SELECT RtI.recipe, BIT_AND(ingredients.available) AS all_available
FROM RtI
INNER JOIN ingredients ON (ingredients.id = RtI.ingredient)
WHERE RtI.recipe = 1

结果:

recipe | all_available
1      | true

但是你必须搜索一个特定的 ID,我想要的不是“告诉我是否所有成分都可用于这个食谱”,而是“告诉我所有成分都可用的所有食谱”。

有没有办法通过使用 MySQL 查询来实现这一点?

4

4 回答 4

1

删除WHERE条件并改为使用GROUP BY RtI.recipe

于 2013-09-04T17:00:02.220 回答
1

尝试

SELECT recipe, MIN(COALESCE(ingredients.available,0)) all_available
FROM rti LEFT JOIN ingredients ON ingredients.id=rti.ingredient
GROUP BY recipe

all_available0用于缺少成分的食谱和1“完整”食谱。

编辑 以防万一,我添加的成分表中甚至没有列出成分COALESCE。可能没有必要,因为该RtI表可能是机器生成的,并且只会包含有效id的 s ...

于 2013-09-04T17:03:43.020 回答
0

使用 ORDER BY: SELECT r.recipe AS recipe, BIT_AND(i.available) AS all_available FROM RtI AS r INNER JOIN ingredients AS i ON (r.ingredient = i.ingredient) GROUP BY r.recipe

于 2013-09-04T17:50:35.650 回答
0

感谢您的大力帮助!

根据您的提示,我现在可以回答我自己的问题并与您分享我的最终解决方案:

SELECT RtI.recipe, recipes.title, ( SUM(ingredients.available) / COUNT(ingredients.available) ) AS available
FROM RtI
LEFT JOIN ingredients ON (ingredients.id = RtI.ingredient)
LEFT JOIN recipes ON (recipes.id = RtI.recipe)
GROUP BY RtI.recipe
ORDER BY ( SUM(ingredients.available) / COUNT(ingredients.available) ) DESC, recipes.title

这给了我一个像这样的表:

recipe | title       | available
1      | Pina Colada | 1.00
2      | Caipirinha  | 0.50

用所有的括号和函数来写有点多,但我认为这就是“视图”的用途。

于 2013-09-04T17:57:22.197 回答