sql >> Database >  >> RDS >> Mysql

MySQL eerste gratis nummer tussen bestaande waarden

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

Hoe het werkt

  1. Links deelnemen aan pro_servers met pro_servers met server_port = server_port + 1 voeg de voorwaarde toe en neem rijen, waar null . is in de volgende haven. Deze rijen tonen de eerste poorten van elke opening. De poort-ID kan worden genomen als server_port + 1 .

  2. Neem alle verwijderde poorten.

  3. Union 1. en 2., bestellen op server_port en neem de eerste.

Er is één aanname voor een antwoord - poort met het laagste nummer wordt altijd genomen. Als het niet waar is, controleer die poort dan apart (of voeg een andere UNION ALL toe) op de vraag).



  1. Hoe PostgreSQL High Availability te bereiken met pgBouncer

  2. Waarom ondersteunt de MyISAM-engine van MySQL geen buitenlandse sleutels?

  3. Oracle Regexp om \n,\r en \t te vervangen door spatie

  4. MySQL-tabel voor breedtegraad en lengtegraad