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
由外部查询返回,用于此边际案例。谢谢,这是一个完美的答案,也感谢您提供了这个解释非常好的答案。