mysql - 如何获取尚未在数据库列中的最小整数

标签 mysql

我在 MySQL 数据库中有一个表,其中有一个 UNIQUE INT(10) 列。该表非常填充,该行包含该列中整数的非连续条目。我想做一个查询,它会得到不在任何行中的最小数字(或 n 个最小数字)。

示例:该表包含列的值为 (1, 2, 3, 5, 7, 8, 10, 12, 15) 的行。 sql 语句应返回即五个最低的未包含值,在本例中为 4, 6, 9, 11, 13

这对 MySQL 来说可能吗?

最佳答案

您可以使用“数字”表(它对各种操作都很方便):

CREATE TABLE num
( i UNSIGNED INT NOT NULL
, PRIMARY KEY (i)
) ;

INSERT INTO num (i)
VALUES
  (1), (2), ..., (1000000) ;

然后:

SELECT 
    num.i
FROM 
        num
    LEFT JOIN
        tableX AS t
            ON num.i = t.columnX
WHERE 
    t.columnX IS NULL
ORDER BY
    num.i
LIMIT 5

或:

SELECT 
    num.i
FROM 
    num
WHERE 
    NOT EXISTS 
    ( SELECT *
      FROM tableX AS t
      WHERE num.i = t.columnX
    )
ORDER BY
    num.i
LIMIT 5

另一种不使用辅助表的方法是使用 MySQL 变量。你可以在SQL-Fiddle, test-2中测试.输出结果和之前的不太一样(只是为了说明可以搞定):

SELECT start_id, end_id
FROM 
  ( SELECT 
        IF( t.columnX <> @id, @id, NULL)       AS start_id
      , IF( t.columnX <> @id, t.columnX-1, NULL) AS end_id
      , @rows := @rows + (t.columnX - @id)     AS r
      , @id := t.columnX + 1                   AS running_id
    FROM 
            tableX AS t
        CROSS JOIN  
            ( SELECT @rows := 0
                   , @id := 1
            ) AS dummy
    WHERE
        @rows < 5
    ORDER BY
        t.columnX
    ) AS tmp
WHERE
    start_id IS NOT NULL

关于mysql - 如何获取尚未在数据库列中的最小整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10103821/

相关文章:

php - Laravel SQL groupBy 和 Sum

mysql - 将数据库内容从一种非常糟糕的结构迁移到一种非常合乎逻辑的结构的最佳实践?

sql - MySQL:在多个表上进行多列连接

PHP 反转 MySQL 数据库结果的顺序

php - 如何使用索引使mysql查询速度更快

php - 将条目插入数据库后如何更新模型?并刷新 View

PHP 和 SQL - 如何选择当年所有月份的最高总和?

mysql - 简而言之,Hadoop与SQL之间的关系到底是什么? Hadoop会淘汰SQL吗?请建议

mysql - 使用 Docker Mysql COPY 为数据库做种失败

mysql - 计算每天从 mysql 中的一个巨大表中创建的行数