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获取序列号范围的主要内容,如果未能解决你的问题,请参考以下文章