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
Cách hoạt động
-
Tham gia trái
pro_servers
vớipro_servers
vớiserver_port = server_port + 1
nối điều kiện và lấy các hàng, trong đó cónull
trong 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_port
và 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).