我有一个新的爱好叫做“把糟糕的口味变成好吃的东西”a.k.a.“混合鸡尾酒”。
因为我是个书呆子,所以我不想在书中查阅食谱,阅读食材清单,注意我遗漏了一些东西。相反,我想拥有一个包含我所收集的食谱和成分的数据库,让计算机告诉我哪些食谱我可以用我目前家里的成分“建立”。为此,我有两个表:
表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查询来实现这一目标?
答案 0 :(得分:1)
删除WHERE
条件,改为使用GROUP BY RtI.recipe
答案 1 :(得分:1)
尝试
SELECT recipe, MIN(COALESCE(ingredients.available,0)) all_available
FROM rti LEFT JOIN ingredients ON ingredients.id=rti.ingredient
GROUP BY recipe
对于缺少成分的食谱,{p> all_available
将为0
,对于'完整'食谱,1
将为COALESCE
。
修改强>
为了以防万一,该成分甚至没有在成分表中列出,我添加了RtI
。可能没有必要,因为id
表可能是机器生成的,只会有效{{1}} s ...
答案 2 :(得分:0)
使用ORDER BY: SELECT r.recipe AS recipe,BIT_AND(i.available)AS all_available 来自RtI AS r INNER JOIN成分AS i ON(r.ingredient = i.ingredient) GROUP BY r.recipe
答案 3 :(得分: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
使用所有括号和函数编写更多内容,但我认为这就是“视图”的用途。