Mysql Group by子句与聚合结果的位置

时间:2016-02-24 11:21:32

标签: mysql sql

我有以下子目录表。

  mysql> select * from suborder;
+-------------+------------------+
| order_state | booking_group_id |
+-------------+------------------+
| CNF         |                1 |
| CNF         |                1 |
| CNF         |                2 |
| BLK         |                1 |
| CNF         |                2 |
+-------------+------------------+

我想获取所有order_state为CNF的所有booking_group_id。因此对于上面的数据,结果应该只是值'2',因为两行都有order_state = CNF,其中对于booking_data_id'1',两行是CNF,一行是BLK,所以不会是输出的一部分。

由于

2 个答案:

答案 0 :(得分:2)

您可以对使用条件聚合的HAVING子句使用分组:

select booking_group_id 
from suborder
group by booking_group_id
having count(case when order_state <> 'CNF' then 1 end) = 0

或者您可以使用NOT EXITS

select distinct * 
from suborder AS s1
where order_state = 'CNF' and 
      not exists (select 1 
                  from suborder AS s2
                  where s2.booking_group_id = s1.booking_group_id and
                        s2.order_state <> 'CNF')

答案 1 :(得分:0)

过滤没有order_state != 'CNF'

记录的记录
SELECT DISTINCT booking_group_id FROM suborder 
    WHERE order_state = 'CNF' AND booking_group_id not in 
(SELECT DISTINCT booking_group_id from suborder WHERE order_state != 'CNF' )

WHERE 子句中的子查询获取所有booking_group_id的{​​{1}}列表,其中包含条件order_state != 'CNF'的记录,并且在该主查询后筛选除了存在的所有ID之外的所有ID在子查询中。

需要注意的另一点:此处使用的子查询将一次执行,因为它独立于主查询。