MariaDB中ID序列断裂时如何计算各连续ID段的min、max值
连续ID段起止值查询方案
针对存在断号的ID序列,按连续段分组统计每个段的最小ID和最大ID,可通过以下两种方案实现:
方案1:窗口函数实现(适配MariaDB 10.2+、MySQL 8.0+版本)
核心逻辑:连续的ID减去按ID排序的行号,差值会保持一致;ID出现断号时差值会发生变化,按差值分组即可拆分出所有连续ID段。
SELECT MIN(id) AS `min(id)`, MAX(id) AS `max(id)` FROM ( SELECT id, id - ROW_NUMBER() OVER (ORDER BY id) AS group_flag FROM book_lists ) AS temp GROUP BY group_flag ORDER BY group_flag;
执行后输出结果和需求完全匹配:
+---------+---------+ | min(id) | max(id) | +---------+---------+ | 1 | 3 | | 7 | 7 | | 9 | 10 | | 12 | 15 | +---------+---------+
方案2:用户变量实现(兼容旧版本MariaDB、MySQL)
如果数据库版本不支持窗口函数,可以用用户变量标记连续段的分组:
SELECT MIN(id) AS `min(id)`, MAX(id) AS `max(id)` FROM ( SELECT id, @group := IF(id = @last_id + 1, @group, @group + 1) AS group_flag, @last_id := id FROM book_lists CROSS JOIN (SELECT @last_id := -1, @group := 0) AS init_vars ORDER BY id ) AS temp GROUP BY group_flag ORDER BY group_flag;
执行结果和方案1完全一致。
内容的提问来源于stack exchange,提问作者Helen
相关产品推荐
相关产品推荐

