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
-
Rejoindre à gauche
pro_servers
avecpro_servers
avecserver_port = server_port + 1
condition de jointure et prendre des lignes, où il y anull
dans la prochaine Port. Ces lignes montrent les premiers ports de chaque espace. L'ID de port peut être pris commeserver_port + 1
. -
Prenez tous les ports supprimés.
-
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).