Mysql 选择第一个不在保留范围内的可用号码

Mysql 选择第一个不在保留范围内的可用号码,mysql,Mysql,我有两个表,框和公司。属于某个公司的每个框都被添加到同一个存储(由字段store\u id定义)中,并且在该存储中具有唯一的编号,并且每个公司都可以为框保留范围(表公司中的字段box\u from和box\u to) 如果在为某个公司保留的范围内没有可用的号码,我需要为新框找到第一个可用号码 例如,如果有两个保留范围,5-10和15-20,并且已经有编号为1-3的框,那么第一个可用的编号是4。如果有编号为1-4的框,则下一个可用编号为11,位于第一个保留范围之后 我找到了一个解决方案,在这个方案

我有两个表,
公司
。属于某个公司的每个框都被添加到同一个存储(由字段store\u id定义)中,并且在该存储中具有唯一的编号,并且每个公司都可以为框保留范围(表公司中的字段box\u from和box\u to)

如果在为某个公司保留的范围内没有可用的号码,我需要为新框找到第一个可用号码

例如,如果有两个保留范围,5-10和15-20,并且已经有编号为1-3的框,那么第一个可用的编号是4。如果有编号为1-4的框,则下一个可用编号为11,位于第一个保留范围之后

我找到了一个解决方案,在这个方案中,我找到了所有可能的下一个数字,然后我必须将结果与表公司交叉连接,以筛选出保留的范围

SELECT number, COUNT(number) as cnt 
FROM (
    SELECT 1 as number FROM boxes WHERE NOT EXISTS (SELECT number FROM boxes WHERE store_id=1 AND number=1) 
    UNION 
    SELECT t1.number+1 as number FROM boxes t1 LEFT JOIN boxes t2 ON t2.number=t1.number+1 WHERE t1.store_id=1 AND t2.number IS NULL
    UNION 
    SELECT boxes_to+1 as number FROM companies WHERE store_id=1 AND boxes_from>0 AND boxes_to>0 AND boxes_to+1 NOT IN (
        SELECT number FROM boxes WHERE store_id=1)
    ) n, companies 
    WHERE number NOT BETWEEN boxes_from AND boxes_to GROUP BY number HAVING cnt=(SELECT COUNT(id) FROM companies
)
此查询返回所有可用的下一个数字:

+--------+-----+
| number | cnt |
+--------+-----+
|      4 |   3 |
|     11 |   3 |
|     21 |   3 |
+--------+-----+

有人有更好的解决方案吗?

如果你愿意,考虑下面这个简单的两步过程:1。如果您还没有这样做,请提供适当的CREATE和INSERT语句(和/或SQLFIDLE),以便我们可以更轻松地复制问题。2.如果您还没有这样做,请提供与步骤1中提供的信息相对应的所需结果集。感谢您的建议。您的答案似乎不错。由于我是php程序员,而不是sql专家,我怀疑我是否找到了最佳解决方案。我想知道是否有其他方法来过滤保留范围中的数字,而不是与公司表和计数结果交叉连接。如果您愿意,请考虑以下简单的两步过程:1。如果您还没有这样做,请提供适当的CREATE和INSERT语句(和/或SQLFIDLE),以便我们可以更轻松地复制问题。2.如果您还没有这样做,请提供与步骤1中提供的信息相对应的所需结果集。感谢您的建议。您的答案似乎不错。由于我是php程序员,而不是sql专家,我怀疑我是否找到了最佳解决方案。我想知道是否有其他方法可以过滤掉保留范围内的数字,而不是交叉连接公司表和计数结果。
+--------+-----+
| number | cnt |
+--------+-----+
|      4 |   3 |
|     11 |   3 |
|     21 |   3 |
+--------+-----+