Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL premier numéro libre entre les valeurs existantes

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

Comment ça marche

  1. Rejoindre à gauche pro_servers avec pro_servers avec server_port = server_port + 1 condition de jointure et prendre des lignes, où il y a null dans la prochaine Port. Ces lignes montrent les premiers ports de chaque espace. L'ID de port peut être pris comme server_port + 1 .

  2. Prenez tous les ports supprimés.

  3. Union 1. et 2., trier par server_port et prenez le premier.

Il y a une hypothèse pour une réponse - le port avec le numéro le plus bas est toujours pris. Si ce n'est pas vrai, vérifiez ce port séparément (ou ajoutez un autre UNION ALL à la requête).