1

我有一张由用户做事生成的事件表。它看起来大致是这样的:

session           |   time                  |  event       |  etc.
06efaa1805ef670c  |   2022-01-07 08:41:03   |  lockFound   |  etc.
06efaa1805ef670c  |   2022-01-07 08:41:43   |  lockLost    |  etc.
154032b09bec72f8  |   2022-01-07 10:41:03   |  lockFound   |  etc.
154032b09bec72f8  |   2022-01-07 10:41:43   |  lockLost    |  etc.

我需要按特定顺序获取所有这些事件:

  1. 它们必须按会话 ID 分组,以便一个会话中的所有事件一起出现
  2. 会话必须按时间顺序排列(最好是会话中第一个事件的时间)
  3. 会话中事件的顺序实际上并不重要
  4. 我不想使用 GROUP BY 因为我需要表中的每个事件

我将如何解决这个问题?

实际数据在这里

检索者:

SELECT * FROM dlrcoco_events ORDER BY time DESC`
4

1 回答 1

1

如果使用 MySQL 8 或更高版本,则可以使用窗口函数:

SELECT *
FROM dlrcoco_events
ORDER BY MIN(time) OVER (PARTITION BY session), session, time

订单说明:

  • 第一列将包含相应会话中第一个事件的时间。
  • 可以有两个最短时间相同的会话,在这种情况下,您必须通过session第二列来打破平局。这确保属于同一会话的行保持在一起。
  • 最后,对于每个会话,您按事件时间排序。

窗口函数可以替换为相关的子查询:

ORDER BY (
    SELECT MIN(time)
    FROM dlrcoco_events AS x
    WHERE x.session = dlrcoco_events.session
), -- other columns as described above
于 2022-01-07T10:39:38.200 回答