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
Jak to funguje
-
Vlevo připojit
pro_servers
spro_servers
sserver_port = server_port + 1
join podmínka a vzít řádky, kde jenull
v dalším přístav. Tyto řádky zobrazují první porty z každé mezery. ID portu lze vzít jakoserver_port + 1
. -
Vezměte všechny smazané porty.
-
Union 1. a 2., seřaďte podle
server_port
a vezměte si první.
Pro odpověď je jeden předpoklad - vždy se bere port s nejnižším číslem. Pokud to není pravda, zkontrolujte tento port samostatně (nebo přidejte další UNION ALL
na dotaz).