SELECT data.sPort
FROM
((SELECT (s.server_port + 1) sPort
FROM pro_servers s
LEFT JOIN pro_servers sp1 ON sp1.server_port = s.server_port + 1
WHERE (sp1.server_port IS NULL)
ORDER BY sPort)
UNION ALL
(SELECT s.server_port sPost
FROM pro_servers s
GROUP BY s.server_port
HAVING COUNT(s.server_port) = SUM(s.server_deleted)
ORDER BY sPort)) AS data
ORDER BY data.sPort
LIMIT 1
SqlFiddle: http://sqlfiddle.com/#!2/12ab1/2
仕組み
-
左結合
pro_servers
pro_servers
を使用server_port = server_port + 1
を使用 条件を結合し、null
がある行を取得します 次の ポート。これらの行は、すべてのギャップからの最初のポートを示しています。ポートIDはserver_port + 1
と見なすことができます 。 -
削除されたすべてのポートを取得します。
-
ユニオン1.および2.、
server_port
で並べ替え 最初のものを取ります。
答えには1つの仮定があります。つまり、番号が最も小さいポートが常に使用されます。そうでない場合は、そのポートを個別に確認してください(または別のUNION ALL
を追加してください クエリに)。