今天業務上有個需求,mysql按組group_by獲取數據,但過濾掉組中某字段包含某值的那些組(如status=1)
數據描述需求
字段 id name status
1 aaa 0
2 aaa 0
3 bbb 0
4 bbb 1
5 bbb 3
6 ccc 0
7 ccc 3
按組分,可得aaa,bbb,ccc這三組數據,但由於bbb組中有包含status=1的數據,需求不能獲取bbb組,要求一條sql查出status不包含=1的組name:aaa,ccc
大概查了下,oracle中有強大的decode()函數實現這種需求,這里就膚淺說下自己的理解,decode(p1,p2,p3,p4)函數有四個或更多個參數(詳見文檔),這四個參數可以為表達式或字段,
意思是:p1的結果1,與p2的結果2比較,if(結果1=結果2),則decode()函數返回p3,else函數返回p4
oracle簡單例子:
select decode(字段status,1,99,0) from dual;--當字段status的值為1時,decode結果為99,否則為0
按開頭說的需求,我們可以在需要過濾的字段上加上decode函數,然后將所有值過濾為0/非0,再group by下,having sum()這個decode結果判斷和是否為0或非0,是非0說明包含,是0說明不包含
但是mysql沒有decode()函數,但是的但是,卻可以用if()函數來替代,效果更好更直觀:
if(p1>p2,p3,p4),意思就是當p1大於p2,if函數返回p3,否則返回p4
變通下,開頭需求可以實現:
select name from t_table group by name having sum(if(status=1),1,0)=0;
結果集為:aaa,ccc