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

    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       
--------------
水果魔方  
草莓雪山