星星点灯是一家水果店,它提供了外卖水果拼盘的服务。水果店能够提供四种水果拼盘:水果魔方、海星欧蕾、猫头鹰、草莓雪山,下表反应了某一时刻店内的水果的准备情况。
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
--------------
水果魔方
草莓雪山