問題:存在する値の間にサーバー用の最初の空きポートを取得します。空き地がない場合は、最高の+1を取ります。
追加:server_deleted = 1の場合、空きポートを取得できます。また、値の間にギャップがある場合は、フリーポートを使用する必要があります。where句にserver_typeを含める必要があります。最小値は最初のポート(例:9000)です。
今私のクエリは見えます:
SELECT server_port + 1
FROM pro_servers s
WHERE s.server_port <> 0
AND s.server_type = 'ts3'
AND s.server_deleted = 0
AND NOT EXISTS
( SELECT s1.server_port
FROM pro_servers s1
WHERE s1.server_port <> 0
AND s1.server_type = 'ts3'
AND s1.server_port = s.server_port + 1
AND s1.server_deleted = 0
)
ORDER BY server_port LIMIT 1
私はそれを行うためのより良い方法があると思います。このクエリの実行は非常に遅くなります。
たとえば、first = minimum = lowest = 9000、nextは9002、9003です。9001を取得する必要があります。9001を追加すると9004が取得されます。最初の値9000はテーブルに存在します。
サンプルデータ
+-----------+-------------+----------------+-------------+
| server_id | server_port | server_deleted | server_type |
+-----------+-------------+----------------+-------------+
| 151 | 9500 | 1 | teamspeak3 |
| 8459 | 9500 | 0 | teamspeak3 |
| 183 | 9501 | 1 | teamspeak3 |
| 264 | 9502 | 1 | teamspeak3 |
| 4155 | 9502 | 1 | teamspeak3 |
| 2707 | 9503 | 1 | teamspeak3 |
| 4160 | 9503 | 1 | teamspeak3 |
| 154 | 9504 | 1 | teamspeak3 |
| 4163 | 9504 | 1 | teamspeak3 |
| 285 | 9506 | 1 | teamspeak3 |
| 4167 | 9506 | 1 | teamspeak3 |
| 8454 | 9506 | 0 | teamspeak3 |
| 241 | 9507 | 1 | teamspeak3 |
| 4169 | 9507 | 1 | teamspeak3 |
| 188 | 9509 | 1 | teamspeak3 |
| 4177 | 9509 | 1 | teamspeak3 |
+-----------+-------------+----------------+-------------+
クエリ結果:9501。このポートを使用した場合、次に次のようになります:9502、9503、9504、9505、9507、9508、9509、9510など。