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:https://sqlfiddle.com/#!2/12ab1/2
Jak to działa
-
Lewo Dołącz do
pro_serverszpro_serverszserver_port = server_port + 1warunek dołączenia i podjęcia wierszy, gdzie jestnullw następnym Port. Te wiersze pokazują pierwsze porty z każdej luki. Identyfikator portu można przyjąć jakoserver_port + 1. -
Zabierz wszystkie usunięte porty.
-
Union 1. i 2., zamów według
server_porti weź pierwszy.
Jest jedno założenie dla odpowiedzi - zawsze brany jest port o najniższym numerze. Jeśli to nieprawda, sprawdź ten port osobno (lub dodaj kolejny UNION ALL do zapytania).