MySQL 5.7查询实现:连续重复消息取最小ID并按ID排序
MySQL 5.7 保留连续重复message组中ID最小的记录并排序
问题描述
给定如下输入数据(表名假设为process_logs):
id message 2485132 Process started 2485118 Process completed 2483660 Process started 2482165 Process started 2480689 Process started 2480686 Process completed 2479225 Process started
需要实现:对连续重复的message记录,仅保留每组中ID最小的条目,最终结果按ID降序排序,期望输出如下:
id message 2485132 Process started 2485118 Process completed 2480689 Process started 2480686 Process completed 2479225 Process started
解决方案
由于MySQL 5.7不支持窗口函数,我们可以通过自定义变量标记连续相同message的分组,再筛选每个分组的最小ID记录:
SELECT t.id, t.message FROM process_logs t JOIN ( SELECT MIN(id) AS min_id FROM ( SELECT id, message, @group_id := CASE WHEN @prev_msg = message THEN @group_id ELSE @group_id + 1 END AS group_id, @prev_msg := message FROM process_logs, (SELECT @group_id := 0, @prev_msg := '') AS init ORDER BY id DESC ) AS grouped_data GROUP BY group_id ) AS group_min_ids ON t.id = group_min_ids.min_id ORDER BY t.id DESC;
逻辑说明
- 初始化变量:通过子查询初始化
@group_id(标记分组ID)和@prev_msg(存储上一条记录的message)两个变量。 - 标记连续分组:按ID降序遍历数据,若当前message与上一条相同则保持分组ID不变,否则分组ID自增,以此区分连续重复的message组。
- 筛选分组最小ID:对每个分组取ID最小值,该值对应连续重复组中需要保留的条目。
- 关联原表并排序:通过最小ID关联原表获取对应message,最后按ID降序输出结果。
内容的提问来源于stack exchange,提问作者SHM
相关产品推荐
相关产品推荐

