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 |
+--------+-----+