[MySQL] Nächster Freier Wert in Datenbank

Dave Dz

Grünschnabel
Hallo,
ich hab ein Problem mit einer MySQL-Abfrage..
Also ich habe eine Tabelle mit folgendem Aufbau:

Code:
ID | Servername | Port
1 | Testserver | 62718
3 | Demoserver | 17283
4 | MeinServer | 22738

Ich will jetzt gerne den nächsten freien Port ermitteln, jedoch immer 2 höher.

In diesem Beispiel wäre der nächste freie Port 17283, bzw. plus 2 also 17285.

Wie kann ich diesen nächsten freien Port ermitteln?

Mein Ansatz war
Code:
SELECT MIN(port) AS FreePort FROM server WHERE NOT EXISTS (SELECT port FROM server WHERE port = port+1) AND NOT EXISTS (SELECT port FROM server WHERE port = port-1) AND port > 30000 AND port < 65535 LIMIT 1
Als Ergebnis bekomme ich damit (in meiner DB) Port 30009, dieser ist jedoch in der Datenbank vorhanden, funktioniert also so nicht...

Ich hoffe mir kann jemand helfen, danke schonmal :)
 
http://wiki.yaslaw.info/wikka/MySQLFirstNotUsedId

Und das ganez angepasst für den 2er Schritt
SQL:
SELECT
    MIN(newIds.newId) AS firstNotUsedId
FROM
    -- jeweils die nächst höhere ID ermitteln
    (SELECT id + 2 AS newId FROM test) AS newIds
    -- und mit der Tabelle zurückverknüpfen
    LEFT JOIN (SELECT id+1 AS id FROM test ) AS ids
        ON newIds.newId = ids.id
WHERE
   ids.id IS NULL;
Die Anpassungen für den 2er Schritt sind das +2 im ersten Subselect und das +1 im 2ten Subselect

Nachtrag: Ist nicht durchgetestet.....

Nachtrag 2:
Habs gestestet. Muss noch etwas angepasst werden. Mit einem UNION erweitern um den neuen Port gegen [alle Bestehnde] und [alle Bestehende+1] zu testen
SQL:
SELECT
    MIN(newPorts.port) AS firstNotUsedPort
FROM
    # jeweils die nächst höhere ID ermitteln
    (SELECT port + 2 AS port FROM ports) AS newPorts
    # und mit der Tabelle zurückverknüpfen
    LEFT JOIN (SELECT port+1 AS port FROM ports UNION SELECT port FROM ports) AS ports
        ON newPorts.port = ports.port
WHERE
   ports.port IS NULL;
Testdaten:
Code:
"port"
"17564"
"17565"
"17566"
"17568"
"17900"

firstNotUsedPort: 17570
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück