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
в следващия пристанище. Тези редове показват първите портове от всяка празнина. Идентификаторът на порта може да се приеме катоserver_port + 1
. -
Вземете всички изтрити портове.
-
Съюз 1. и 2., подреждане по
server_port
и вземете първия.
Има едно предположение за отговор - винаги се взема порт с най-нисък номер. Ако не е вярно, проверете този порт отделно (или добавете друг UNION ALL
към заявката).