mysql - 在 MySQL 中计算行数,直到列中的值发生变化

标签 mysql

我有同样的问题,就像这个问题 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/

相关文章:

mysql - mysql select查询中的响应时间不一致

MySQL 说 : #1064 - You have an error in your SQL syntax creating a stored procedure

php - 异常 'PDOException',消息为“SQLSTATE[HY000] : General error: 1293 Incorrect table definition when setup Magento 2. 0 (0.1.0-alpha107)”

php - 创建相互依赖的下拉列表

c# - * 的类型初始值设定项引发异常

mysql - 限制访问用户并从数据库加载数据

mysql - 根据 MySql 中输入的日期设置行中的值

c# - 将行插入 MySQL 数据库的最有效方法

mysql - 从同一表列更新列

php - 无法使用 PHP 从 MYSQL 获取值洞察 <<Some_text_here>> 或 <some_text_here>