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
Come funziona
-
Sinistra Unisciti a
pro_servers
conpro_servers
conserver_port = server_port + 1
condizione di join e prendere righe, dove c'ènull
nel prossimo porta. Queste righe mostrano le prime porte di ogni spazio vuoto. L'ID della porta può essere preso comeserver_port + 1
. -
Prendi tutte le porte eliminate.
-
Union 1. e 2., ordina per
server_port
e prendi il primo.
C'è un presupposto per una risposta:viene sempre presa la porta con il numero più basso. Se non è vero, controlla quella porta separatamente (o aggiungi un altro UNION ALL
alla domanda).