Marze: Eine Auugabe vor dem Treffer

Kann mir jemand hier weiterhelfen ?

Ich habe in meiner msql Datenbank folgende Tabelle, sie wir nach SORT sortiert

SELECT * FROM table ORDER BY sort ASC

id ! sort ! titel

1 ! 7 ! titel
2 ! 5 ! titel
3 ! 2 ! titel
4 ! 4 ! titel
5 ! 3 ! titel
6 ! 6 ! titel
7 ! 1 ! titel

doch wenn ich nur ab XXX abwärts ausgeben lassen möchte geht das nicht.

SELECT * FROM table WHERE sort<4 ORDER BY sort ASC LIMIT

es sollt die Zeile mit der ID 5 kommen, aber es erscheint die Zeile mit der ID 1

  1. Hallo

    id ! sort ! titel
    
    1 ! 7 ! titel
    2 ! 5 ! titel
    3 ! 2 ! titel
    4 ! 4 ! titel
    5 ! 3 ! titel
    6 ! 6 ! titel
    7 ! 1 ! titel
    

    doch wenn ich nur ab XXX abwärts ausgeben lassen möchte geht das nicht.

    SELECT * FROM table WHERE sort<4 ORDER BY sort ASC LIMIT 
    

    es sollt die Zeile mit der ID 5 kommen, aber es erscheint die Zeile mit der ID 1

    Erst sprichst du davon, von XXX abwärts ausgeben zu lassen, wobei XXX kleiner vier ist (sort<4). Eine Zeile mit sort = 5 darf demnach nicht im Ergebnis enthalten sein. Dann sprichst du davon, das Ergebnis abwärts (sortiert?) ausgeben zu lassen, sorgst aber mit ORDER BY sort ASC dafür, dass die Sortierung aufsteigend erfolgt. Wenn es also einen Datensatz/Datensätze mit sort = 1 gibt, wird der/werden die auch zuerst angezeigt.

    Tschö, Auge

    --
    Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
    Hohle Köpfe von Terry Pratchett
  2. Hallo Marze,

    was du schreibst, ist reichlich merkwürdig und klingt nach einem Layer-8 Error.

    Ich habe in meiner msql Datenbank folgende Tabelle, sie wir nach SORT sortiert

    Nein, das wird sie nicht. Sie wird nach ID sortiert. Zumindest präsentierst Du das so.

    Deine zweite Query sollte dieses Ergebnis liefern:

    id !sort! titel
     7 !  1 ! titel
     3 !  2 ! titel
     5 !  3 ! titel
    

    Wenn das bei Dir nicht der Fall ist, mach einen Schritt zurück und überprüfe deine impliziten Annahmen. Greifst Du tatsächlich auf die Daten zu, auf die Du zuzugreifen glaubst? Der MYSQL Server tut genau das, was Du ihm sagst, und bei so einfachen Queries tut er das auch zu 100% korrekt. Falls es Bugs im Server gibt, dann irgendwo in den Schmuddelecken, wo kaum einer rumläuft.

    Prüfe also: Ist das, was Du ihm sagst, wirklich das, was Du auch willst?

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo,

      Nein, das wird sie nicht. Sie wird nach ID sortiert. Zumindest präsentierst Du das so.

      Deine zweite Query sollte dieses Ergebnis liefern:

      Auch die zweite angegebene Query kann nicht das liefern, was hier präsentiert wird: Die Limit-Klausel liefert ohne einen entsprechenden Parameter zumindest in meinem Test eine Fehlermeldung…

      Gruß
      Kalk

      1. Hallo Tabellenkalk,

        oh. LIMIT hab ich glatt übersehen 😂

        Rolf

        --
        sumpsi - posui - obstruxi
  3. Tach!

    SELECT * FROM table ORDER BY sort ASC

    id ! sort ! titel
    
    1 ! 7 ! titel
    2 ! 5 ! titel
    3 ! 2 ! titel
    4 ! 4 ! titel
    5 ! 3 ! titel
    6 ! 6 ! titel
    7 ! 1 ! titel
    

    Diese Ausgabe passt nicht zum gezeigten Statement, es ist nicht nach sort sortiert.

    doch wenn ich nur ab XXX abwärts ausgeben lassen möchte geht das nicht.

    Worauf konkret bezieht sich das XXX?

    SELECT * FROM table WHERE sort<4 ORDER BY sort ASC LIMIT

    es sollt die Zeile mit der ID 5 kommen, aber es erscheint die Zeile mit der ID 1

    Was genau möchtest du erreichen? Soll von der sortierten Menge nur ein Teil ausgegeben werden? Dann geht das nur anhand der Position in der Ergebnismenge unter Verwendung der LIMIT-Klausel. Ein ORDER BY zieht erst ganz am Ende und das LIMIT noch danach. Andere Klauseln davor - wie das WHERE - schränken also die Datenmenge ein, bevor eine Sortierung stattfindet.

    Bei einem SQL-Statement werden die einzelnen Klauseln immer von links beginnend abgearbeitet. Ausnahme ist die Berechnung der in der SELECT-Klausel angeführten Felder/Ausdrücke. Das passiert zwischen WHERE und GROUP BY.

    Abgesehen davon gibt es noch die Möglichkeit, die Ergebnismenge als Datenquelle zu nehmen. Dazu fügt man das Statement als Subquery in die FROM-Klausel eines übergeordneten Statements ein. Aber das scheint mir hier nicht notwendig zu sein. Alles müsste mit WHERE und LIMIT ausreichend einzuschränken gehen.

    dedlfix.