我正在通过专栏' 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
谢谢!
答案 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
的情况,因为您希望它包含在结果中,但不计算在内。