私はこの問題に数時間失敗しましたが、頭を悩ませることができません。「人間」の視点から見るとかなり単純に思えますが、どういうわけかコードに書き込めないようです。
状況: 特定の場所に割り当てられている開始番号と現在の「アクティブな」番号 (または一般的な場所の場合は 0) によって定義されるいくつかの番号範囲が与えられた場合
startno | actualno | location
100 | 159 | 0
200 | 203 | 1
300 | 341 | 2
400 | 402 | 0
ご覧のとおり、1 つの場所に対して 2 つの範囲が存在する場合もあります。この場合、startno が最も高い範囲 (この場合は 400) のみがアクティブと見なされ、他の範囲は履歴の目的でのみ存在します。
すべてのユーザーは特定の場所 (場所列と同じ ID) に割り当てられますが、一般的な場所 (ゼロ) には割り当てられません。
使用者が新しい番号を必要とするとき、彼は自分の場所に割り当てられた範囲から割り当てられた番号を取得します。何も見つからない場合は、最も高い一般的な番号から割り当てられます (たとえば、user.location = 0 は 403、user.location を取得します)。 = 2 は 342 になります)。
次に、ユーザーは、この番号を使用するか、割り当てられた番号から始まる量 X を使用するかを選択できます。
ここで質問があります: 範囲が互いに重ならないようにするにはどうすればよいでしょうか? ユーザー (場所 = 2) が次の番号 342 を取得し、その後に 100 個の番号が必要であると判断したとします。これにより、一般的な範囲内にある 441 までの終了番号が生成されますが、これは発生してはなりません。
開始番号と終了番号の両方を使用し、MAX() を集計し、テーブル自体を結合して、いくつかのネストされた SELECT を試してみましたが、100% 正しく取得できません。