tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
315
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Dave Dz Dave Dz ist offline Rookie
    Registriert seit
    Feb 2011
    Beiträge
    5
    Hallo,
    ich hab ein Problem mit einer MySQL-Abfrage..
    Also ich habe eine Tabelle mit folgendem Aufbau:

    Code :
    1
    2
    3
    4
    
    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 :
    1
    
    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
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    http://wiki.yaslaw.info/wikka/MySQLFirstNotUsedId

    Und das ganez angepasst für den 2er Schritt
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    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
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    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 :
    1
    2
    3
    4
    5
    6
    
    "port"
    "17564"
    "17565"
    "17566"
    "17568"
    "17900"

    firstNotUsedPort: 17570
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    Dave Dz Dave Dz ist offline Rookie
    Registriert seit
    Feb 2011
    Beiträge
    5
    mhm.. das funktioniert aber scheinbar nicht mit einer einzigen Tabelle?
     

  4. #4
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    öh doch. In meinem Beispiel heisst die Tabelle `ports` und ist nur eine einzige Tabelle.
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  5. #5
    Dave Dz Dave Dz ist offline Rookie
    Registriert seit
    Feb 2011
    Beiträge
    5
    Okay, manchmal ist man bisschen blind

    Funktioniert alles, danke dir!
     

Ähnliche Themen

  1. [PHP][MYSQL] Checken ob Wert in Datenbank
    Von ggf_razor im Forum PHP
    Antworten: 8
    Letzter Beitrag: 15.03.10, 22:53
  2. nächster Datensatz; mdb Datenbank
    Von tobi726 im Forum Java Grundlagen
    Antworten: 2
    Letzter Beitrag: 15.12.08, 16:06
  3. Nächster Wert aus MySQl lesen - auto increment
    Von wal im Forum Relationale Datenbanksysteme
    Antworten: 7
    Letzter Beitrag: 04.12.08, 17:40
  4. While -> Abruch und nächster Wert
    Von PhoenixDH im Forum PHP
    Antworten: 2
    Letzter Beitrag: 29.07.05, 13:57
  5. Nächster Wert eines Arrays
    Von xNeOx im Forum PHP
    Antworten: 2
    Letzter Beitrag: 11.10.04, 10:03