sql >> Database teknologi >  >> RDS >> Mysql

MySQL første gratis nummer mellem eksisterende værdier

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ådan fungerer det

  1. Venstre Deltag i pro_servers med pro_servers med server_port = server_port + 1 join condition og tag rækker, hvor der er null i den næste Havn. Disse rækker viser de første porte fra hvert hul. Port-id'et kan tages som server_port + 1 .

  2. Tag alle slettede porte.

  3. Union 1. og 2., bestilles efter server_port og tag den første.

Der er én antagelse for et svar - port med det laveste tal tages altid. Hvis det ikke er sandt, skal du kontrollere den port separat (eller tilføje en anden UNION ALL til forespørgslen).



  1. Sådan opretter du relationer i MySQL

  2. Sådan håndhæves unikke på tværs af flere tabeller

  3. A.* er ikke i GROUP BY med venstre join på laravel query Builder

  4. Adgang nægtet for brugeren 'test'@'ip' (ved hjælp af adgangskode:JA)