前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL 获取状态一致的分组

SQL 获取状态一致的分组

作者头像
白日梦想家
发布2021-01-04 10:57:54
5610
发布2021-01-04 10:57:54
举报
文章被收录于专栏:SQL实现SQL实现

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

代码语言:javascript
复制
    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 时,它就可以被制作了。

代码语言:javascript
复制
SELECT 
  platter 
FROM
  platters 
GROUP BY platter 
HAVING SUM(IF(ready = 1, 1, 0)) = COUNT(*);

platter       
--------------
水果魔方  
草莓雪山  

由于只有两种状态,要么准备好了,要么没准备好。我们可以换另一种表达,当某个水果拼盘下没准备好的水果的数量为 0 时,这个拼盘可以被制作。

代码语言:javascript
复制
SELECT 
  platter 
FROM
  platters 
GROUP BY platter 
HAVING SUM(IF(ready = 0, 1, 0)) = 0

也可以通过状态去判断,如果拼盘下的水果都准备好了,那就说明不存在没准备好的水果。

代码语言:javascript
复制
SELECT DISTINCT 
  platter 
FROM
  platters a 
WHERE NOT EXISTS 
  (SELECT 
    NULL 
  FROM
    platters 
  WHERE platter = a.platter 
    AND ready = 0);
  
  
platter       
--------------
水果魔方  
草莓雪山  
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SQL实现 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档