mysql - 返回 MySQL 中特定列值的滞后

标签 mysql

目前,我有以下值表:

--------------------------------
|   ID  |    Action    | Time  |
--------------------------------
|   1   |    A         | 01    |    
|   1   |    BB        | 10    |
|   1   |    C         | 12    |
|   2   |    C         | 05    |
|   2   |    A         | 08    |
|   2   |    BB        | 17    |
|   2   |    A         | 26    |
|   2   |    BB        | 47    |

假设数据按时间升序排列。 我希望每次调用时,当数据按 ID 分组时,有一个名为 BB_Time 的新列,其中包含 BB 与调用中前一个事件的时间差,看起来像:

----------------------------
|   ID  |   ...   | BB_Time |
----------------------------
|   1   |   ...   |   09    |    
|   2   |   ...   |   21    |

如果 BB 在调用开始时发生,BB_Time 将等于 0,如果 BB 在调用中出现多次,则该列应返回最大时间差。 编辑:如果 BB 没有出现在调用中,则 NULL 或 0 都可以。

我能够破解的最接近的(?)仅限于 WHERE 子句中的 BB 操作并以这种方式跟踪时间,但这并没有' t 给出一个滞后。

想法?

最佳答案

有些人不信任 session 变量,但我发现只要你小心,它们是相对可靠的。免责声明:我相信 MySQL 没有正式定义用于评估 SELECT 结果字段的评估顺序。实际上,它似乎总是从左到右,这是该查询所依赖的,但是每当 MySQL Server 版本发生变化时,就需要考虑/重新评估这一点。另外,我在这里看到了其他相关问题,这些问题表明这种查询可能无法与 VIEW 一起“很好地发挥”。

SELECT ID, MAX(BB_Time) AS BB_Time
FROM (
   SELECT ID, `Action`
   , @prevID := IFNULL(@prevID, 0) AS prevID
   , IF(`Action`<>'BB'
        , 0
        , IF(@prevID<>ID, 0, `Time` - IFNULL(@prevTime, `Time`))
     ) AS BB_Time
   , @prevTime := `Time`
   , @prevID := ID
   FROM the_table
   ORDER BY ID, `Time`
) AS subQ
GROUP BY ID
;

更新为显示所有 ID 值,其中 0 表示没有 BB 操作的 ID。

编辑:使用示例数据进行测试。第一次返回0,第二次就成功了。可能需要在选择之前将 @prev session 变量初始化为安全的值。

关于mysql - 返回 MySQL 中特定列值的滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31460868/

相关文章:

php - 连接 php 时 MySql 运行缓慢。与工作台连接时工作速度很快

PHP:如何在redis中缓存大表?

php - 使用 API 存储在数据库中的笑脸图标无法正确显示

mysql - 带有 INNER JOIN 的Where子句 - 作用于子集还是原始表?

php - mysqli_insert_id : What if someone inserts another row just before I call this?

mysql - 是否可以将此查询转换为连接?

php - 编辑表格内容并将其保存到数据库

mysql - 这两个查询在连接上的区别以及包括使用合并

javascript - 自动显示数据库中没有的日期的 0 销售额

PHP + MYSQL,需要每n分钟更新一次DB中的注销时间