找出 [1, 161] 中哪些数字不在结果集中?

hug*_*eow 3 mysql query mysql-console gaps-and-islands

如何找到[1, 161]结果集中没有的两个数字?

我可以使用 sql 命令找到这两个数字吗?

mysql> select blog_id from wp_blogs;

...

|     149 |
|     150 |
|     151 |
|     152 |
|     153 |
|     154 |
|     155 |
|     156 |
|     157 |
|     158 |
|     159 |
|     160 |
|     161 |
+---------+
159 rows in set (0.25 sec)
Run Code Online (Sandbox Code Playgroud)

序列是从1到161,应该有161个数字,但结果集中只有159个数字。

mysql> select count(blog_id) from wp_blogs;
+----------------+
| count(blog_id) |
+----------------+
|            159 |
+----------------+
1 row in set (0.24 sec)
Run Code Online (Sandbox Code Playgroud)

如何找到丢失的数字?

Phi*_*lᵀᴹ 11

要查找数字范围内的间隙:

测试表及数据:

mysql> CREATE TABLE wp_blogs
    -> (
    ->   blog_id INTEGER
    -> );

mysql> insert into wp_blogs values(1);
mysql> insert into wp_blogs values(2);
mysql> insert into wp_blogs values(4);
mysql> insert into wp_blogs values(6);
mysql> insert into wp_blogs values(7);
mysql> insert into wp_blogs values(8);
mysql> insert into wp_blogs values(10);
Run Code Online (Sandbox Code Playgroud)

询问:

mysql> SELECT a.blog_id+1 AS start, MIN(b.blog_id) - 1 AS end
    ->     FROM wp_blogs AS a, wp_blogs AS b
    ->     WHERE a.blog_id < b.blog_id
    ->     GROUP BY a.blog_id
    ->     HAVING start < MIN(b.blog_id);
+-------+------+
| start | end  |
+-------+------+
|     3 |    3 |
|     5 |    5 |
|     9 |    9 |
+-------+------+
Run Code Online (Sandbox Code Playgroud)