2016-02-24 32 views
0

我有以下的子順序表。Mysql Group by子句與聚合結果的位置

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,所以不會是輸出的一部分。

感謝

回答

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') 

子查詢中沒有記錄下條款獲取所有booking_group_id其對於條件order_state != 'CNF'和主查詢後的記錄列表過濾除子查詢中存在的所有id。

另一點需要注意的是:此處使用的子查詢將被單次執行,因爲它與主查詢無關。

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')