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
Como funciona
-
Junte-se à esquerdapro_servers
compro_servers
comserver_port = server_port + 1
condição de junção e obter linhas, onde hánull
no no próximo porta. Essas linhas mostram as primeiras portas de cada intervalo. O ID da porta pode ser usado comoserver_port + 1
.
-
Pegue todas as portas excluídas.
-
União 1. e 2., peça porserver_port
e pegue o primeiro.
Há uma suposição para uma resposta - a porta com o número mais baixo é sempre tomada. Se não for verdade, verifique essa porta separadamente (ou adicione outro
UNION ALL
para a consulta).