MySQL:在达到值后启动group by

时间:2015-04-09 23:46:30

标签: mysql group-by

我正在通过专栏' new_treads'在'响应'的价值首先等于1。

id   |treads    |response
------------------
1    | 1        | 0        
2    | 1        | 1
3    | 2        | 0    
4    | 2        | 0
5    | 2        | 1
6    | 2        | 1
7    | 2        | 1
...  | ...      | ...
15   | 9        | 0     
16   | 9        | 1    
17   | 9        | 0  
18   | 9        | 1 
19   | 10       | 0  

目前我可以使用:

SELECT 
thread,
count(response),
sum(response)
FROM messages
GROUP BY thread

获得:

treads    |count(response) | sum(response)
------------------------------------------
 1        | 2              | 1
 2        | 5              | 3
 9        | 4              | 2 
 10       | 1              | 0

但我想要做的是启动小组,或计数(响应),其中“回复”#39; = 1.给予:

treads    |count(response) | sum(response)
------------------------------------------
 1        | 1              | 1
 2        | 3              | 3
 9        | 3              | 2 
 10       | 0              | 0

谢谢!

1 个答案:

答案 0 :(得分:1)

这很麻烦,抱歉。

select treads, if(sum(response) >= 1, count(response), 0) count, sum(response) sum
  from messages
    where id not in (
     select m.id 
       from messages m 
       where id < 
        (select min(id) id 
          from messages 
          where response = 1 
            and treads = m.treads
         group by treads)
    )
    group by treads;

在这里小提琴:http://sqlfiddle.com/#!9/fffd0/14

作为解释,第一个子查询获取所有消息ID,其中id小于该行程的第一行的id response = 1 - 此值来自最里面的子查询,这给了我们一个排除列表以过滤掉最外层查询的结果。

我们使用if内的count语句来处理胎面的唯一记录response = 0的情况,因为您希望它包含在结果中,但不计算在内。