计算多行中具有特定值的行

时间:2013-11-19 13:02:51

标签: mysql count

设置正确的标题非常困难,因为我不知道如何描述我的问题。

我有一张这样的表:

dlID | dl_seID | dlEpisode | dlFlag
___________________________________
1    | 1       | 1         | 0
2    | 1       | 2         | 1
3    | 1       | 3         | 1
4    | 2       | 1         | 1
5    | 2       | 2         | 0
6    | 3       | 1         | 0

我想要的是一个选择查询,我得到这样的东西:

dlID | dl_seID | dlEpisode | dlFlag | dlFlagCount
_________________________________________________
1    | 1       | 1         | 0      | 2
2    | 1       | 2         | 1      | 2
3    | 1       | 3         | 1      | 2
4    | 2       | 1         | 1      | 1
5    | 2       | 2         | 0      | 1
6    | 3       | 1         | 0      | 0

dlFlagCount应该是dlFlag = 1的计数器,其中dl_seID = dl_seID。

第二次尝试: 我需要一个值,我看到有多少Flags的值为1,dl_seID相同。

这可能吗?

我希望你们知道我想要的东西^^

此致

2 个答案:

答案 0 :(得分:1)

试试这个:

select 
    a.*,
    ifnull(b.ctflags,0)
from 
    tablea a left join
     ( select dl_seID, count(dlFlag) ctflags 
         from tablea 
        where dlFlag=1
       group by dl_seID ) b on (a.dl_seID = b.dl_seID)

左连接只是为了获得带有0标志的注册表

请参阅小提琴:http://sqlfiddle.com/#!2/ef9b0/5

修改 正如操作要求一些解释,这里是:

你问的是要计算dl_seID的标记数量,为此你需要这样做你自己解决问题,首先你得到dl_seID标记的计数,这个是这个子查询:

   select dl_seID, count(dlFlag) ctflags 
     from tablea 
    where dlFlag=1
   group by dl_seID

这成为了一个'separe table'或一组新的数据,无论你想要什么。然后你必须将它与原始数据(来自你的表格)一起加入,就像查询答案一样。

左连接部分是因为可能有一些数据不会与where dlFlag=1抱怨,因此如果您想要获得0,则必须从表中存在或不存在我们的所有值创建子组。这个ifnull(b.ctflags,0)适用于您桌上存在的数据数据,但没有标记(针对您的问题)。如果仅使用b.ctflags,则会带来空值。

答案 1 :(得分:0)

SELECT x.*
     , COALESCE(y.flagcount,0) flagcount
  FROM my_table x
  LEFT
  JOIN 
     ( SELECT seID
            , COUNT(*) flagcount
         FROM my_table 
        WHERE flag = 1 
        GROUP 
           BY seid
     ) y
    ON y.seid = x.seid;