SQL-如何检索数字范围内的第一个空闲数字

AJ9*_*989 5 mysql sql

我有一张桌子TblClient
2个重要的列是:ClientID(PK,增量)和ClientNumber

我们可以添加新客户端,并且ClientID会自动分配,但是ClientNumber可以选择。

我们想对进行“建议” ClientNumber,但用户可以决定输入自己的电话号码,而不接受我们的建议。

建议必须是第一个可用的ClientNumber大于2200(首先ClientNumber是2200)。

我们这样做是因为,如果用户输入一个手册号(例如5000),而最后插入的手册号是2500,则我们不会将下一个“建议”设为5001,而是2501。

用查询返回此数字的正确方法是什么?

谢谢!

GMB*_*GMB 2

您可以使用自左连接反模式来解决它,如下所示:

select coalesce(min(c.ClientNumber) + 1, 2200) first_available_client_id
from tblclient c
left join tblclient c_free on c_free.ClientNumber = c.ClientNumber + 1
where c_free.ClientID is null
Run Code Online (Sandbox Code Playgroud)

说明:left join尝试将每条记录与具有下一个客户编号的另一条记录合并。然后,该where子句过滤不匹配的连接,这意味着表中尚未使用下一个客户编号的记录。最后,聚合函数min(...) + 1返回第一个可用的客户号码。该函数在表为空时coalesce()返回。2200

为了提高效率,您需要一个索引ClientNumber(它应该已经存在,因为您希望该列是唯一的)。

避免使用聚合的另一个选项是:

select c.ClientNumber + 1 first_available_client_id
from tblclient c
left join tblclient c_free on c_free.ClientNumber = c.ClientNumber + 1
where c_free.ClientID is null
order by c.ClientNumber
limit 1
Run Code Online (Sandbox Code Playgroud)

但是,此选项不处理表为空的情况。