MySQL:查找最低可用数或追加

MySQL:查找最低可用数或追加,mysql,sql,Mysql,Sql,我正在寻找一种解决方案,如何在所有数据行之间找到列的最小数目 我的表“bot\u实例”有一列名为“bot\u端口”。 我有一个定义的最低端口9000,可能有开放端口 例如,可能有数据行9000、9001、9005、9006,那么所需的查询应该返回9002 它也可能是9001、9002、9004,那么查询应该返回9000 或者9000,9001,9002,那么结果应该是9003 我在这里没有找到解决办法。我只找到一个回复所有数字的字段,但第二个字段将数字标记为免费。 对我来说,表中缺少免费数字。只

我正在寻找一种解决方案,如何在所有数据行之间找到列的最小数目

我的表
“bot\u实例”
有一列名为
“bot\u端口”
。 我有一个定义的最低端口9000,可能有开放端口

例如,可能有数据行9000、9001、9005、9006,那么所需的查询应该返回9002

它也可能是9001、9002、9004,那么查询应该返回9000 或者9000,9001,9002,那么结果应该是9003

我在这里没有找到解决办法。我只找到一个回复所有数字的字段,但第二个字段将数字标记为免费。 对我来说,表中缺少免费数字。只有已使用端口的记录

我希望有人能帮助我


提前谢谢

我想你只是想:

select (case when tt.min_port > 9000 then 9000
             else min(t.port) + 1
        end)
from t cross join
     (select min(port) as min_port from t) tt
where not exists (select 1 from t t2 where t2.port = t.port + 1);

大多数外部查询获取缺少的第一个端口。
min\u端口的附加连接用于确定是否缺少第一个值。

您还可以使用变量获取第一个可用端口:

SELECT MIN(bot_port) - port_diff + 1 AS available_port
FROM (
   SELECT bot_port,
          IF(@t := @p, IF(@p := bot_port, bot_port - @t, 0), 0) AS port_diff
   FROM bot_instances
   CROSS JOIN (SELECT @t :=0, @p := 8999) AS v
   ORDER BY bot_port) AS t
WHERE t.port_diff > 1   
给定以下一组输入数据:

bot_port
--------
9000
9001
9002
9006
9007
bot_port
--------
9001
9002
9006
9007
内部查询返回:

 bot_port, port_diff
---------------------
 9000       1
 9001       1
 9002       1
 9006       4
 9007       1
bot_port, port_diff
-------------------
9001       2
9002       1
9006       4
9007       1
外部查询获取
9006
,这是间隙>1后的第一个端口,减去
port_diff
以获取上一个端口值,然后添加
1
以获取下一个端口,这是第一个可用端口

给定以下一组输入数据:

bot_port
--------
9000
9001
9002
9006
9007
bot_port
--------
9001
9002
9006
9007
内部查询返回:

 bot_port, port_diff
---------------------
 9000       1
 9001       1
 9002       1
 9006       4
 9007       1
bot_port, port_diff
-------------------
9001       2
9002       1
9006       4
9007       1

因此,
9001-2+1=9000
由外部查询返回,用于此边际案例。

谢谢,这是一个完美的答案,也感谢您提供了这个解释非常好的答案。