表:Logs
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| log_id | int |
+---------------+---------+
id 是上表的主鍵横蜒。
上表的每一行包含日志表中的一個 ID官帘。
后來一些 ID 從 Logs 表中刪除迷郑。編寫一個 SQL 查詢得到 Logs 表中的連續(xù)區(qū)間的開始數(shù)字和結(jié)束數(shù)字嘿般。
將查詢表按照 start_id 排序靴姿。
查詢結(jié)果格式如下面的例子:
Logs 表:
+------------+
| log_id |
+------------+
| 1 |
| 2 |
| 3 |
| 7 |
| 8 |
| 10 |
+------------+
結(jié)果表:
+------------+--------------+
| start_id | end_id |
+------------+--------------+
| 1 | 3 |
| 7 | 8 |
| 10 | 10 |
+------------+--------------+
結(jié)果表應(yīng)包含 Logs 表中的所有區(qū)間魂仍。
從 1 到 3 在表中拐辽。
從 4 到 6 不在表中。
從 7 到 8 在表中擦酌。
9 不在表中俱诸。
10 在表中。
生成數(shù)據(jù)
CREATE TABLE logs2(
log_id INT);
INSERT INTO logs2 VALUE(1), (2),(3),(7),(8),(10);
SELECT *
FROM logs2;
解答
連續(xù)的分為一組
SELECT L.`log_id`,
@group:=IF(L.`log_id`- @pre_log_id = 1, @group, @group+1) AS `group`,
@pre_log_id:= L.`log_id`
FROM logs2 AS L, (SELECT @group:=0, @pre_log_id:= NULL) AS init
ORDER BY L.log_id;
分組后最小值為起始 最大值為結(jié)束
SELECT MIN(tmp.log_id) AS start_id, MAX(tmp.log_id) AS end_id
FROM (SELECT L.`log_id`,
@group:=IF(L.`log_id`- @pre_log_id = 1, @group, @group+1) AS `group`,
@pre_log_id:= L.`log_id`
FROM logs2 AS L, (SELECT @group:=0, @pre_log_id:= NULL) AS init
ORDER BY L.log_id) AS tmp
GROUP BY tmp.group;