2012-07-05 32 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