sql >> Databasteknik >  >> RDS >> Mysql

MySQL första lediga nummer mellan existerande värden

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

  1. Vänster Gå med i pro_servers med pro_servers med server_port = server_port + 1 gå med i villkoret och ta rader där det finns null i nästa hamn. Dessa rader visar första portar från varje lucka. Port-ID kan tas som server_port + 1 .

  2. Ta alla borttagna portar.

  3. 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).



  1. Använda OR i LIKE-frågan i MySQL för att jämföra flera fält

  2. Är det möjligt att döda en enda fråga i Oracle utan att döda sessionen?

  3. Sammanfoga flera bord utan gemensam nyckel

  4. Anslut till MSSQL-databasen med Flask-SQLAlchemy