如果列中的所有行都为true,则返回true

时间:2013-09-04 16:55:15

标签: php mysql sql join calculated-columns

我有一个新的爱好叫做“把糟糕的口味变成好吃的东西”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 JOINingredient = 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 个答案:

答案 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

使用所有括号和函数编写更多内容,但我认为这就是“视图”的用途。