MySQL获取序列号范围

Posted

技术标签:

【中文标题】MySQL获取序列号范围【英文标题】:MySQL Get Range of Serial Numbers 【发布时间】:2013-11-04 04:32:50 【问题描述】:

由于数据库设计不当,我难以检索数据库中的序列号范围。

我的数据如下:-

    XY100001 - XY101000 | User_A ---> 1000 个数据 XY101001 - XY102000 | User_B ---> 1000 条数据 XY102001 - XY102500 | User_C ---> 500 个数据 XY102501 - XY103000 | User_A ---> 1000 个数据

数据将存储在数据库中,如下所示:-

| 1 |用户A | XY100001 |日期时间 | | 2 |用户A | XY100002 |日期时间 | .. | 1000 |用户A | XY101000 |日期时间 | | 1001 |用户_B | XY101001 |日期时间 | | 1002 |用户_B | XY101002 |日期时间 | .. | 2000 |用户_B | XY102000 |日期时间 | | 2001 |用户_C | XY102001 |日期时间 | | 2002 |用户_C | XY102002 |日期时间 | .. | 2500 |用户_C | XY102500 |日期时间 | | 2501 |用户A | XY102501 |日期时间 | | 2502 |用户A | XY102502 |日期时间 | .. | 3000 |用户A | XY103000 |日期时间 |

我尝试选择最小和最大序列号,在该组之后按 DateTime 但仍然无法获得正确的范围,因为每个用户将有多个范围。

如果我使用 min 和 max 的示例输出如下:-

|用户A | XY100001 | XY103000 | |用户_B | XY101001 | XY102000 | |用户_C | XY102001 | XY102500 |

您可以看到,User_A 的输出错误。 User_A 应该有 2 个范围 (XY100001-XY101000) 和 (XY102501-XY103000)

问题是,我怎样才能找回所有的范围?

有什么想法吗?

【问题讨论】:

有各种stack overflow posts关于这种问题... @gloomy.penguin 日期并不重要,因为我想找到序列号的范围。没有日期怎么办? 【参考方案1】:

一个可能的解决方案

SELECT user, MIN(sn) range_start, MAX(sn) range_end
  FROM
(
  SELECT user, sn, @r := IF(@g = user, @r, @r + 1) range_num, @g := user
    FROM table1 CROSS JOIN (SELECT @r := 0, @g := NULL) i
   ORDER BY sn
) q
 GROUP BY user, range_num

样本输出:

|用户 | RANGE_START | RANGE_END | |--------|-------------|------------| |用户A | XY100001 | XY101000 | |用户A | XY102501 | XY103000 | |用户_B | XY101001 | XY102000 | |用户_C | XY102001 | XY102500 |

这里是SQLFiddle演示

【讨论】:

它的工作!你迭代每个序列。谢谢彼得。 :)

以上是关于MySQL获取序列号范围的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中获取连续的序列号范围的SQL

怎么重置mysql的自增列AUTO

MYSQL - 范围内快速搜索的结果之间的限制

mysql 列中的组序列值

获取表列中序列值的范围

MySQL从查询结果中获取数据