2012-11-19 19 views
6

MySqlには電話番号の5つのテーブルがあります。シンプルな構造は、私は数範囲に番号のこのデータとグループ連続ブロックを分類する必要がmysqlの連続したレコードブロックの選択

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

を次のようにレコードがある

Accounts 
id varchar(32) NOT NULL 

です。私はC#LINQのソリューションを実装するのにはオープンですが、サーバー側のMySqlは最優秀賞です。このデータを集計して出力が以下のようになるようにMySqlには方法がありますか?

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

私はSQLについては分かりませんが、PHP(または実際にはいとこのいずれか)を使用することは簡単です。 –

答えて

13

連続したエントリを1つのグループにまとめる簡単な方法があります。グループ化すると(row_number - entry)、連続するエントリは同じグループになります。ここでの例では、私が何を意味するかを実証されています

クエリ

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

結果:すべて連続しているエントリがPHONENUM - @CURROWに同じ値を持っているか

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

注意してください。我々はその列のグループ、および各グループの最小&最大を選択した場合は、要約を持っている

クエリ:(一つの例外を除いて:あなたはNULLとEND値を置き換えることができることが要件だ場合、STARTは= ENDの場合)

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'節に含めます。 Web上で数多くの例を見て、そのデータが数値であることを検証する方法を知ることができます。入力データが既に数値型であると仮定したので、クエリが正しく動作するようにキャストする必要があるかもしれません。 – mellamokb