You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑说明

  1. 初始化变量:通过子查询初始化@group_id(标记分组ID)和@prev_msg(存储上一条记录的message)两个变量。
  2. 标记连续分组:按ID降序遍历数据,若当前message与上一条相同则保持分组ID不变,否则分组ID自增,以此区分连续重复的message组。
  3. 筛选分组最小ID:对每个分组取ID最小值,该值对应连续重复组中需要保留的条目。
  4. 关联原表并排序:通过最小ID关联原表获取对应message,最后按ID降序输出结果。

内容的提问来源于stack exchange,提问作者SHM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:30:07