關於數字的經典SQL程式設計:連續範圍問題

season0891發表於2013-01-05
【IT168 技術】連續範圍問題也是一個非常經典的SQL程式設計問題。為了使講解易於理解,我們先來建立一些測試資料。
#div_code img{border:0px;}<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)


--&gtCREATE TABLE t ( a INT UNSIGNED NOT NULL PRIMARY KEY );

INSERT INTO t VALUES(
1);
INSERT INTO t VALUES(
2);
INSERT INTO t VALUES(
3);
INSERT INTO t VALUES(
100);
INSERT INTO t VALUES(
101);
INSERT INTO t VALUES(
103);
INSERT INTO t VALUES(
104);
INSERT INTO t VALUES(
105);

  可以看到1~3是連續的,100~101是連續的,103~105是連續的,那麼怎麼能得到如下表所示的結果呢?

關於數字的經典SQL程式設計:連續範圍問題
▲連續範圍

  我們來看下面這句SQL語句及其返回的結果集。

#div_code img{border:0px;}<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)


--&gtmysql> SELECT a,@a:=@a+1 rn FROM t,(SELECT @a:=0) AS a;
+-----+------+
| a   | rn   |
+-----+------+
|  
1 |    1 |
|  
2 |    2 |
|  
3 |    3 |
|
100 |    4 |
|
101 |    5 |
|
103 |    6 |
|
104 |    7 |
|
105 |    8 |
+-----+------+
8 rows in set (0.00 sec)

  rn列是人為計算出來的行號。是不是可以透過連續給出的行號來反映出連續範圍的規律呢?如果還沒有看出,那麼再看下面這個SQL及它的返回結果集。

#div_code img{border:0px;}<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)


--&gtmysql> SELECT a,rn,a-rn
    
-> FROM
    
-> (SELECT a,@a:=@a+1 rn FROM t,(SELECT @a:=0) AS a)
    
-> AS b;
+-----+------+------+
| a   | rn   | a
-rn |
+-----+------+------+
|  
1 |    1 |    0 |
|  
2 |    2 |    0 |
|  
3 |    3 |    0 |
|
100 |    4 |   96 |
|
101 |    5 |   96 |
|
103 |    6 |   97 |
|
104 |    7 |   97 |
|
105 |    8 |   97 |
+-----+------+------+
8 rows in set (0.00 sec)

相關文章