我在这个问题上失败了几个小时,只是无法解决这个问题。从“人类” POV 看来,这似乎相当简单,但不知何故,我似乎无法将其写入代码。
情况:给定由起始编号和分配给特定位置的当前“活动”编号定义的多个编号范围(或 0 用于通用位置)
startno | actualno | location
100 | 159 | 0
200 | 203 | 1
300 | 341 | 2
400 | 402 | 0
现在,如您所见,一个位置也可以有两个范围。在这种情况下,只有 startno 最高的范围(在这种情况下为 400)被认为是活动的,另一个只是为了历史目的而存在。
每个用户都被分配到一个特定的位置(与位置列中的 ID 相同),但永远不会分配到一个通用的位置(零)。
当用户想要一个新号码时,他将从分配给他的位置的范围中获得一个分配的号码,或者,如果没有找到,则从最高的通用号码中获得一个号码(例如 user.location = 0 将获得 403,user.location = 2 将得到 342)。
然后,用户可以选择使用这个数字或从分配的数字开始的数量 X。
问题来了:如何确保范围不会相互重叠?假设用户(位置 = 2)获得下一个数字 342,并决定他需要 100 个数字。这将产生 441 的结束编号,这在通用范围内,这是绝对不能发生的。
我尝试了几个嵌套的 SELECT,同时使用起始和结束编号,聚合 MAX(),将表加入自身,但我无法 100% 正确。