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
Så fungerar det
-
Vänster Gå med i
pro_servers
medpro_servers
medserver_port = server_port + 1
gå med i villkoret och ta rader där det finnsnull
i nästa hamn. Dessa rader visar första portar från varje lucka. Port-ID kan tas somserver_port + 1
. -
Ta alla borttagna portar.
-
Union 1. och 2., beställ efter
server_port
och ta den första.
Det finns ett antagande för ett svar - porten med det lägsta numret tas alltid. Om det inte är sant, kontrollera den porten separat (eller lägg till en annan UNION ALL
till frågan).