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

Il primo numero libero di MySQL tra i valori esistenti

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

  1. Sinistra Unisciti a pro_servers con pro_servers con server_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 come server_port + 1 .

  2. Prendi tutte le porte eliminate.

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