2013-11-04 29 views
0

由於數據庫設計不當,我很難檢索數據庫中的序列號範圍。MySQL獲取系列號範圍

我有如下數據: -

  1. XY100001 - XY101000 | User_A ---> 1000 data
  2. XY101001 - XY102000 | User_B ---> 1000 data
  3. XY102001 - XY102500 | User_C ---> 500 data
  4. XY102501 - XY103000 | USER_A ---> 1000個數據

,數據將在數據庫存儲如下: -

 
| 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 | 

我試圖選擇最小和最大的序列號,該組由日期時間,但仍然無法後得到正確的範圍,因爲每個用戶將有多個範圍。

樣本輸出,如果我使用的最小值和最大值如下: -

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

可以看到,錯誤的輸出USER_A。 User_A應該有2個範圍(XY100001-XY101000)和(XY102501-XY103000)

問題是,我如何找回所有範圍?

任何想法?

+0

還有各種[堆棧溢出文章](HTTP的://計算器。 com/search?q = sql + missing + date + ranges)關於這種問題... –

+0

@ gloomy.penguin日期並不重要,因爲我想要f指示序列號的範圍。如果沒有約會怎麼樣? – skycrew

回答

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演示

+0

它的工作!你迭代每一個序列。感謝peterm。 :) – skycrew