获取MySQL列中的最小未使用值

时间:2014-09-08 07:58:09

标签: mysql sql minimum

我有一个带有整数ID列的表。我想获得此列的最小未使用值。查询应找到表ID中的第一个孔并获取其中的最小值。我会尝试用一些例子来解释它。

示例1:无孔表

在这种情况下,我有一个没有漏洞的表,查询应该只是得到最小的未使用值:应该得到:4

|id|
|1 |
|2 |
|3 |

示例2:顶部有洞的桌子

在这种情况下,我们在顶部有一个洞(缺失值:1)。查询找到了洞并获得了最小值:应该得到1。

|id|
|2 |
|3 |
|4 |

同样在这种情况下,我们在顶部有一个洞,但我们内部有更多的缺失值(缺少值:1和2)。查询找到了洞并获得了最小值:应该得到1。

|id|
|3 |
|4 |
|5 |

示例3:中间有洞的桌子

在这种情况下,我们在中间有一个洞(缺失值:2和3)。查询找到了洞并获得了最小值:应该得到2。

|id|
|1 |
|4 |
|5 |

示例4:顶部和中间有孔的表

在这种情况下,我们有多个洞:一个在顶部(缺失值:1),一个在中间(缺失值:3)。查询找到第一个洞并获得其中的最小值:应该得到1。

|id|
|2 |
|4 |
|6 |

我已经尝试了this post中提出的解决方案,但在我的情况下它没有按预期工作。有什么想法吗?

4 个答案:

答案 0 :(得分:8)

SELECT min(unused) AS unused
FROM (
    SELECT MIN(t1.id)+1 as unused
    FROM yourTable AS t1
    WHERE NOT EXISTS (SELECT * FROM yourTable AS t2 WHERE t2.id = t1.id+1)
    UNION
    -- Special case for missing the first row
    SELECT 1
    FROM DUAL
    WHERE NOT EXISTS (SELECT * FROM yourTable WHERE id = 1)
) AS subquery

答案 1 :(得分:3)

使用连接而不是EXISTS执行此操作的方式略有不同: -

SELECT MIN(t1.id)
FROM 
(
    SELECT 1 AS id
    UNION ALL
    SELECT id + 1
    FROM yourTable
) t1
LEFT OUTER JOIN yourTable t2
ON t1.id = t2.id
WHERE t2.id IS NULL;

使用子查询的任何解决方案的缺点是它们不可能使用任何索引

答案 2 :(得分:1)

您可以创建一个只包含数字的表格。我在下面的查询中模拟了这个表。然后你可以离开加入这个表。

SELECT
MIN(numbers.n) AS missing_value
FROM (SELECT 1 as n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) numbers
LEFT JOIN your_table yt ON numbers.n = yt.id
WHERE yt.id IS NULL

答案 3 :(得分:0)

如果在某些其他表格中有1到n的值,请说t2,然后只需检查

即可
select min(id1) from t2 where id1 not exist(select id from t1);

你会得到答案;