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: https://sqlfiddle.com/#!2/12ab1/2
Cách hoạt động
-
Tham gia trái
pro_serversvớipro_serversvớiserver_port = server_port + 1nối điều kiện và lấy các hàng, trong đó cónulltrong tiếp theo Hải cảng. Các hàng này hiển thị các cổng đầu tiên từ mọi khoảng trống. Id cổng có thể được lấy làserver_port + 1. -
Lấy tất cả các cổng đã xóa.
-
Union 1. và 2., đặt hàng theo
server_portvà lấy cái đầu tiên.
Có một giả định cho một câu trả lời - cổng có số thấp nhất luôn được sử dụng. Nếu không đúng, hãy kiểm tra cổng đó một cách riêng biệt (hoặc thêm một UNION ALL khác cho truy vấn).