Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL erste freie Zahl zwischen vorhandenen Werten

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

Wie es funktioniert

  1. pro_servers beitreten mit pro_servers mit server_port = server_port + 1 Join-Bedingung und Take-Zeilen, wo null ist im nächsten Hafen. Diese Zeilen zeigen die ersten Ports von jeder Lücke. Die Port-ID kann als server_port + 1 angenommen werden .

  2. Alle gelöschten Ports übernehmen.

  3. Union 1. und 2., sortiert nach server_port und nimm den ersten.

Es gibt eine Annahme für eine Antwort - Port mit der niedrigsten Nummer wird immer genommen. Wenn dies nicht der Fall ist, überprüfen Sie diesen Port separat (oder fügen Sie einen weiteren UNION ALL hinzu zur Abfrage).