2012-11-19 48 views
6

我在MySql 5的電話號碼中有一個表。簡單的結構是在mysql中選擇連續的記錄塊

Accounts 
id varchar(32) NOT NULL 

的記錄如下

27100070000 
27100070001 
27100070002 
27100070003 
27100070004 
27100070005 
27100070008 
27100070009 
27100070012 
27100070015 
27100070016 
27100070043 

我需要通過數字該數據和組連續塊到號碼範圍進行排序。我願意在C#LINQ中實現解決方案,但服務器端MySql是一等獎。在MySql中有什麼方法可以彙總這些數據,以便輸出如下?

Start  | End 
------------------------- 
27100070000 | 27100070005 
27100070008 | 27100070009 
27100070012 | 27100070015 
27100070016 | NULL 
27100070043 | NULL 
+0

我不知道SQL,但PHP(或真正的任何堂兄弟)是微不足道的。 –

回答

13

有一個簡單的技巧可以將連續的條目合併到一個組中。如果按(row_number - entry)進行分組,則連續的條目將在同一組中結束。這裏有一個例子展示了我的意思:

查詢

SELECT phonenum, @curRow := @curRow + 1 AS row_number, phonenum - @curRow 
from phonenums p 
join (SELECT @curRow := 0) r 

結果

| PHONENUM | ROW_NUMBER | PHONENUM - @CURROW | 
------------------------------------------------- 
| 27100070000 |   1 |  27100069999 | 
| 27100070001 |   2 |  27100069999 | 
| 27100070002 |   3 |  27100069999 | 
| 27100070003 |   4 |  27100069999 | 
| 27100070004 |   5 |  27100069999 | 
| 27100070005 |   6 |  27100069999 | 
| 27100070008 |   7 |  27100070001 | 
| 27100070009 |   8 |  27100070001 | 
| 27100070012 |   9 |  27100070003 | 
| 27100070015 |   10 |  27100070005 | 
| 27100070016 |   11 |  27100070005 | 
| 27100070040 |   12 |  27100070028 | 

注意,是連續的所有條目如何有PHONENUM - @CURROW相同的值。如果我們組上欄,並選擇分鐘&最大每一組的,你有總結(有一個例外:你可以用NULL更換終值,如果start =結束時,如果這是一個要求):

查詢

select min(phonenum), max(phonenum) from 
(
    SELECT phonenum, @curRow := @curRow + 1 AS row_number 
    from phonenums p 
    join (SELECT @curRow := 0) r 
) p 
group by phonenum - row_number 

結果

| MIN(PHONENUM) | MAX(PHONENUM) | 
--------------------------------- 
| 27100070000 | 27100070005 | 
| 27100070008 | 27100070009 | 
| 27100070012 | 27100070012 | 
| 27100070015 | 27100070016 | 
| 27100070040 | 27100070040 | 

演示:http://www.sqlfiddle.com/#!2/59b04/5

+0

謝謝你的出色答案!如何處理phonenum可能是非數字的情況,比如它可能是del_2712212還是ip地址?我現在只想排除這個「髒」的數據。 –

+1

@Zahir:想出一個過濾器來保留這些數據,並將其包含在內部查詢的where子句中。你應該能夠在網上找到許多例子來驗證數據是數字的。您可能還需要將其轉換爲查詢才能正常工作,因爲我認爲輸入數據已經是數字類型。 – mellamokb