MySQL获取序列号范围

时间:2013-11-04 04:32:51

标签: mysql sql

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

我的数据如下: -

  1. XY100001 - XY101000 | User_A ---> 1000个数据
  2. XY101001 - XY102000 | User_B ---> 1000个数据
  3. XY102001 - XY102500 | User_C ---> 500个数据
  4. XY102501 - XY103000 | User_A ---> 1000个数据
  5. ,数据将存储在数据库中,如下所示: -

    | 1    | User_A | XY100001 | DateTime |
    | 2    | User_A | XY100002 | DateTime |
    ..
    | 1000 | User_A | XY101000 | DateTime |
    | 1001 | User_B | XY101001 | DateTime |
    | 1002 | User_B | XY101002 | DateTime |
    ..
    | 2000 | User_B | XY102000 | DateTime |
    | 2001 | User_C | XY102001 | DateTime |
    | 2002 | User_C | XY102002 | DateTime |
    ..
    | 2500 | User_C | XY102500 | DateTime |
    | 2501 | User_A | XY102501 | DateTime |
    | 2502 | User_A | XY102502 | DateTime |
    ..
    | 3000 | User_A | XY103000 | DateTime |
    

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

    如果我使用min和max,则输出样本如下: -

    | User_A | XY100001 | XY103000 |
    | User_B | XY101001 | XY102000 |
    | User_C | XY102001 | XY102500 |
    

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

    问题是,如何找回所有范围?

    有什么想法吗?

1 个答案:

答案 0 :(得分: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

示例输出:

|   USER | RANGE_START | RANGE_END |
|--------|-------------|-----------|
| User_A |    XY100001 |  XY101000 |
| User_A |    XY102501 |  XY103000 |
| User_B |    XY101001 |  XY102000 |
| User_C |    XY102001 |  XY102500 |

这是 SQLFiddle 演示