Phil: MySql

Hallo, ich möchte den nächsthöheren Eintrag aus einer
Mysql-DB ausgeben.

SELECT name WHERE order_id is > $aktuelle_order_id LIMIT 1

So würde es gehen, oder gibt es einen speziellen Befehl
für den Fall?

Danke
Phil

  1. Hallo,

    Hallo, ich möchte den nächsthöheren Eintrag aus einer
    Mysql-DB ausgeben.

    was verstehst Du unter dem nächsthöheren Eintrag?

    SELECT name WHERE order_id is > $aktuelle_order_id LIMIT 1

    So würde es gehen,

    Nö, das gibt einen Syntaxfehler, es fehlt die FROM-Klausel, die Kombination der Operatoren is und > ist nicht gestattet - und selbst wenn Du dies korrigierst, fehlt immer noch die notwendige ORDER-BY-Klausel, um sicher den gewünschten Wert zu erhalten.

    oder gibt es einen speziellen Befehl für den Fall?

    Es gibt bestimmt SQL-Anweisungen, mit denen Du Dein Ziel erreichen kannst.
    Das hängt davon ab, was Dein Ziel ist, das hängt außerdem von Deinen Daten ab:

    Wenn ich davon ausgehe, dass die Werte in der Spalte order_id eindeutig sind und Du den Namen haben möchtest der zu dem Datensatz gehört, dessen order_id den nächstgrößerern Wert als Deinen Vergleichswert hat, dann könntest Du dies zum Beispiel so erreichen

    SELECT                          -- Gib mir  
        name                        -- die Namen  
    FROM                            -- aus  
        tabelle                     -- meiner Tabelle  
    WHERE                           -- wobei mich nur die Datensätze interessieren  
        order_id > vergleichswert   -- deren order_id größer ist als mein Wert  
    ORDER BY                        -- sortiert  
        order_id                    -- nach der Spalte order_id  
    LIMIT                           -- und limitiere die Ergebnismenge  
        1                           -- auf den ersten Datensatz  
    
    

    Schicker und verständlicher finde ich jedoch eine Umsetzung mit einer korrelierten Unterabfrage:

    SELECT                               -- Gib mir  
        t1.name                          -- den Namen  
    FROM                                 -- aus  
        tabelle t1                       -- meiner Tabelle,  
                                         -- angesprochen unter dem Namen t1,  
    WHERE                                -- dessen  
        t1.order_id = (                  -- order_id gleich dem  
        SELECT                           --  
            MIN(t2.order_id)             -- minimalen Wert der Spalte order_id  
        FROM                             -- aus meiner  
            tabelle t2                   -- Tabelle, diesmal mit t2 angesprochen,  
        WHERE                            -- ist, die  
            t2.order_id > vergleichswert -- größer sind als der Vergleichswert  
    )
    

    Sofern Deine MySQL-Version keinen antiquarischen Wert besitzt, liefern Dir beide Statements den gleichen Wert. Nutze EXPLAIN, um herauszufinden, welches performanter ist.

    Freundliche Grüße

    Vinzenz

  2. Hi!

    Hallo, ich möchte den nächsthöheren Eintrag aus einer Mysql-DB ausgeben.

    Die Daten liegen per Definition in ungeordneter Reihenfolge in einer Tabelle. Ein nächster oder vorhergehender Datensatz lässt sich erst nach einer Sortierung bestimmen.

    SELECT name WHERE order_id is > $aktuelle_order_id LIMIT 1
    So würde es gehen, oder gibt es einen speziellen Befehl für den Fall?

    Das Sortieren solltest du noch hineinbringen (nebst FROM-Klause und das is entfernen). Eine Vereinfachung dazu gibt es nicht. Und diese Methode funktioniert natürlich nur, wenn order_id eindeutig (unique) ist.

    Lo!

  3. yo,

    SELECT name WHERE order_id is > $aktuelle_order_id LIMIT 1

    So würde es gehen, oder gibt es einen speziellen Befehl
    für den Fall?

    so geht es nicht, da die sortierung fehlt. rdbms sind mengenorientiert, srpich datensätze werden ohne eine bestimmte reihenfolge zurück geliefert, es sei den, man fügt die explizit eine ORDER BY klausel hinzu. bei dir werden alle datensätze zurück gegeben, die größer als die aktuelle_order_id sind (was immer das auch sein soll), aber die reihenfolge, wie diese datensätze zurückgegeben werden ist wahlfrei. zusätzlich zu beachten ist, dass LIMIT ein element nur von mysql ist, sprich deine abfrage ist nicht SQL Standard konform.

    Ilja