我有同样的问题,就像这个问题 Count rows until value in column changes mysql 但是,尽管问题已解决,但我不明白这个查询。因为我的声誉点很低,所以我无法在那里发表评论,必须提出新问题。
我的例子:
mysql> select * from example;
+----+-------+------+
| id | name | succ |
+----+-------+------+
| 1 | peter | 1 |
| 2 | bob | 1 |
| 3 | peter | 0 |
| 4 | peter | 0 |
| 5 | nick | 1 |
| 6 | bob | 0 |
| 7 | peter | 1 |
| 8 | bob | 0 |
| 9 | peter | 1 |
| 10 | peter | 1 |
+----+-------+------+
10 rows in set (0.00 sec)
我想计算peter的连续真实值(id降序,结果必须是3),我知道如何设置这样的查询:
mysql> select count(succ)
from example
where id > (select max(id) from example where succ = 0);
+-------------+
| count(succ) |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
但是如何获取彼得的结果,以及是否可以获取按名称分组的结果,如下所示:
+--------+------+
|name | succ |
+--------+------+
| peter | 3 |
| bob | 0 |
| nick | 1 |
+--------+------+
最佳答案
使用变量来计算连续成功的次数(看到失败时重新启动),并加入一个选择每个名称的最高 id 的查询(有点类似于 McNets 的答案)
SELECT a.name, a.count FROM (
SELECT e1.id, e1.name, e1.succ,
@count_success := IF (@prev_name = e1.name AND e1.succ = 1, @count_success + 1, e1.succ) AS `count`,
@prev_name := e1.name AS `prev_name`
FROM `example` e1, (SELECT @count_success :=0, @prev_name := NULL) init
ORDER BY e1.name, e1.id ) `a`
JOIN (SELECT MAX(id) AS `max` FROM `example` GROUP BY `name`) `b` ON a.id = b.max
关于mysql - 在 MySQL 中计算行数,直到列中的值发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42628601/