sql >> Base de Datos >  >> RDS >> Mysql

MySQL primer número libre entre valores existentes

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

  1. Unirse a la izquierda pro_servers con pro_servers con server_port = server_port + 1 unir condición y tomar filas, donde hay null en la próxima Puerto. Estas filas muestran los primeros puertos de cada espacio. El ID del puerto se puede tomar como server_port + 1 .

  2. Tomar todos los puertos eliminados.

  3. 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).