星星点灯是一家水果店,它提供了外卖水果拼盘的服务。水果店能够提供四种水果拼盘:水果魔方、海星欧蕾、猫头鹰、草莓雪山,下表反应了某一时刻店内的水果的准备情况。
id platter fruit ready ------ ------------ --------- -------- 1 水果魔方 猕猴桃 1 2 水果魔方 香蕉 1 3 水果魔方 菠萝 1 4 水果魔方 芒果 1 5 水果魔方 哈密瓜 1 6 海星欧蕾 草莓 1 7 海星欧蕾 橙子 0 8 猫头鹰 猕猴桃 1 9 猫头鹰 小橘子 0 10 猫头鹰 橙子 0 11 猫头鹰 草莓 1 12 草莓雪山 草莓 1
上面这些数据存在 platters 表中,platter 是拼盘的名称,fruit 是拼盘要用到的水果,ready 表示水果是否准备好了。当有客户订水果拼盘时,只有拼盘要用到的所有水果都准备好了才能制作。
现在,我们要写 SQL 找出可以立即制作的水果拼盘的名称。
实现的方式比较多,有一种是通过数量去判断。比如水果魔方,它需要的水果有 5 种,当这些水果处于准备好的状态的数量也为 5 时,它就可以被制作了。
SELECT platter FROM platters GROUP BY platter HAVING SUM(IF(ready = 1, 1, 0)) = COUNT(*); platter -------------- 水果魔方 草莓雪山
由于只有两种状态,要么准备好了,要么没准备好。我们可以换另一种表达,当某个水果拼盘下没准备好的水果的数量为 0 时,这个拼盘可以被制作。
SELECT platter FROM platters GROUP BY platter HAVING SUM(IF(ready = 0, 1, 0)) = 0
也可以通过状态去判断,如果拼盘下的水果都准备好了,那就说明不存在没准备好的水果。
SELECT DISTINCT platter FROM platters a WHERE NOT EXISTS (SELECT NULL FROM platters WHERE platter = a.platter AND ready = 0); platter -------------- 水果魔方 草莓雪山