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ómo funciona
-
Unirse a la izquierda
pro_servers
conpro_servers
conserver_port = server_port + 1
unir condición y tomar filas, donde haynull
en la próxima Puerto. Estas filas muestran los primeros puertos de cada espacio. El ID del puerto se puede tomar comoserver_port + 1
. -
Tomar todos los puertos eliminados.
-
Unión 1. y 2., ordenar por
server_port
y toma el primero.
Hay una suposición para una respuesta:siempre se toma el puerto con el número más bajo. Si no es cierto, verifique ese puerto por separado (o agregue otro UNION ALL
a la consulta).