2012-07-05 31 views
3

我有一個2列的表格,以下是我的表格結構使用GROUP BY需要Mysql查詢幫助嗎?

referral_id |狀態

531 | 0 
531 | 0 
531 | 3 
530 | 3 
529 | 3 
528 | 3 
527 | 3 
527 | 0 
527 | 0 
523 | 2 
523 | 0 
523 | 3 
522 | 3 
522 | 3 
522 | 3 
522 | 3 
511 | 3 

我的預期輸出是

referral_id |狀態

530 | 3 
529 | 3 
528 | 3 
522 | 3 
511 | 3 

第一列referral_id可以有相同ID的多個元組(見referral_id的531和527)。我需要確保具有相同referral_id的元組如果所有相應的「狀態」都不是3,那麼它們將被消除。如果所有相應的「狀態」都是3,那麼我需要應用GROUP BY來獲得結果中的referral_id 。 「狀態」列可以有1到4的值,但我只需要查找3.那麼我怎樣才能達到這個結果呢?

+0

等等,你確定你的意思是'刪除所有不是3'嗎?因爲527有一個3,那就意味着527將在結果中。或者你的意思是'如果不是全部都是3',就刪除? – Konerak 2012-07-05 12:30:16

+1

@Konerak我的理解是,當所有referral_id的狀態都等於3時,我們需要顯示所有referral_id。 – 2012-07-05 12:37:47

+0

*嘟something有關epsilon-delta公式的東西* – Konerak 2012-07-05 12:38:27

回答

6

怎麼樣......

select referral_id, max(status) 
from tablename 
group by referral_id 
having max(status) = 3 and max(status) = min(status) 
4

你並不需要group by,只是做這樣的:

select distinct t.referral_id 
from tablename t 
where t.referral_id not in (
          select referral_id 
          from tablename 
          where status <> 3 
          ) 
order by t.referral_id desc 
0

您應該使用NOT EXISTS

Select referral_id, status 
FROM yourtable a 
WHERE NOT EXISTS (
    select 1 
    from yourtable b 
    where b.referral_id = a.referral_id 
    and b.status != 3) 
+0

您的第二查詢是錯誤的。我認爲它會選擇所有的數據。 – 2012-07-05 12:35:50

+0

第二個查詢確實是錯誤的。刪除。 – Konerak 2012-07-05 12:37:31

0

開始與此

select referral_id from table 
group by referral_id 
having (min(status)=3 and max(status)=3 and count(status)=3) or (count(status)<3) 
+0

爲什麼'count'是?他不需要每組都有3行。 – 2012-07-05 12:36:43