Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL primeiro número livre 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

Como funciona

  1. Junte-se à esquerda pro_servers com pro_servers com server_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 como server_port + 1 .

  2. Pegue todas as portas excluídas.

  3. União 1. e 2., peça por server_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).