Bernd: Warum spinnt meine Sortierung?

Warum werden Einträge einfach dazwischen geschoben?

SELECT p_sort_datum
FROM projekte
LEFT JOIN projektstatus ON projektstatus.ps_code = projekte.p_status
GROUP BY p_code
ORDER BY ps_sort ASC , p_sort_datum ASC 

Auszug aus der DB

Das Feld hat den Typ date in der DB.

  1. Hallo Bernd,

    dein Computer tut genau das, was Du ihm sagst. Aber Du sagst ihm nicht das, was Du von ihm willst.

    Vergleiche deine SELECT-Liste mit der ORDER BY Liste.

    Was fällt Dir auf?

    Lies im Zweifelsfall die Dokumentation von ORDER BY durch.

    Rolf

    --
    sumpsi - posui - clusi
    1. Ok, ich habe die Abfrage etwas überarbeitet

      SELECT p_id, p_status, ps_sort, p_sort_datum
      FROM projekte
      LEFT JOIN projektstatus ON projektstatus.ps_code = projekte.p_status
      WHERE p_status =  '54a556b805869244d18fe0dc0c19c4ce'
      GROUP BY p_code
      ORDER BY ps_sort ASC, p_sort_datum ASC 
      

      Die Datenbank stimmt

      DB

      Die Ausgabe auf der Webseite allerdings nicht

      DB 1

      1. Hallo Bernd,

        okay, wenn ps_sort immer den gleichen Wert hat, ist es für die Reihenfolge unerheblich.

        Allerdings zeigt die Ausgabe auf der Webseite andere Daten als deine phpmyadmin Ausgabe. Meine Checkpoints:

        Gesamtzahl: Datenbank 28 Zeilen, Webseite 30 Datümer Stichprobe: Datenbank hat fünf mal den 28.06., die Webseite sieben mal.

        Wenn deiner Meinung nach auf der Webseite das Ergebnis für p_status = '54a556b805869244d18fe0dc0c19c4ce' stehen sollte, dann greifst Du entweder auf zwei verschiedene Datenbanken zu, oder verwendest auf der Webseite doch einen anderen p_status.

        Da müsstest Du mal genauer gucken. Kontrollausgaben und so.

        Rolf

        --
        sumpsi - posui - clusi
        1. Hallo,

          sorry, da habe ich dich etwas verwirrt mit den roten Zahlen :/ Interessant ist hier nur die zweite Spalte. Die dritte Spalte ist das bis Datum und die erste die Anfrage.

          Datenbank hat 28 Abfragen und die Ausgabe auf der Seite ebenfalls 28 Einträge, daher stimmt das Ergebnis was die Menge angeht.

          1. Hallo Bernd,

            ja ok, und du zeigst aus Platzgründen nicht die vollständige Ausgabe. D.h. du hast überprüft, ob die 28 Zeilen passen würden, wenn denn die Sortierung stimmte?

            Die dumme Frage, ob im Code der Webseite auch wirklich die gleiche Abfrage steht wie in deiner DB-Abfrage, trau ich mich ja gar nicht zu stellen 😉. Die Frage "ist's wirklich die gleiche DB, die Du abfragst" auch nicht.

            Was mir aber auffällt, ist, dass Du ein MYSQL „Feature“ nutzt, das nicht SQL Standardkonform ist. GROUP BY und im SELECT keine Aggregatfunktionen. "Offziell" ist es so, dass man bei Verwendung von GROUP BY nur die Spalten im SELECT direkt aufführen darf, die im GROUP BY stehen. Denn nur die sind eindeutig definiert. Die übrigen nicht.

            Nimm an, du hättest zwei Rows mit p_code=5. Die eine hat p_id=4, die andere hat p_id=6. Welche p_id soll MYSQL nun liefern? Das ist undefiniert. Du bekommst irgendeine; die erste, die MYSQL antrifft. Nach SQL Standard muss jede Spalte, die in deinem SELECT steht, mit einem MIN, MAX, AVG, SUM oder COUNT versehen sein. Es könnte möglich (aber unwahrscheinlich) sein, dass die Webseite und die DB-Abfrage eine unterschiedliche Auswahl für „irgendeine Row“ getroffen haben.

            Ist die Abfrage denn genau das, was Du brauchst? Ich will damit nicht abdriften, sondern herausfinden, ob man diesen ominösen GROUP BY loswerden kann, der undefiniertes Verhalten beinhaltet.

            SELECT p_id, p_status, ps_sort, p_sort_datum
            FROM projekte
            LEFT JOIN projektstatus ON projektstatus.ps_code = projekte.p_status
            WHERE p_status =  '54a556b805869244d18fe0dc0c19c4ce'
            GROUP BY p_code
            ORDER BY ps_sort ASC, p_sort_datum ASC 
            

            Du suchst aus der projekte-Table alle Zeilen zum p_status '54...ce' heraus. Zu jedem Treffer gehst Du in die projektstatus Table und suchst dort zum p_status die Zeile mit gleichem p_code, um den ps_sort Wert zu ermitteln.

            Das ergibt nur Sinn, wenn projektstatus zum gegebenen p_status maximal eine Zeile aufweist, denn ansonsten würdest Du ja jede Projektzeile n-fach bekommen. Wenn meine Logik stimmt, dann ist ps_sort als Sortierspalte unnötig - denn ps_sort ist ja immer gleich. Und der LEFT JOIN verliert seine Existenzberechtigung gleich mit. Es sei denn, da gibt's was, was man aus deinem Posting heraus nicht erkennen kann.

            Den Sinn des GROUP BY p_code verstehe ich allerdings noch nicht. GROUP BY ist nur sinnvoll, wenn Du zu einer Kombination von p_status und p_code mehr als einen Satz in der projekte Tabelle hast, und das auf einen reduzieren willst.

            Rolf

            --
            sumpsi - posui - clusi
      2. Hallo,

        warum befinden sich in den Grafiken der Tabellen unterschiedliche Daten? Kann es sein, das du andere Daten ausgibst als du sortierst?

        Gruß
        Jürgen

        1. Hallo,

          sorry für die Verwirrung, hab es hier gerade aufgeklärt https://forum.selfhtml.org/self/2019/jun/25/warum-spinnt-meine-sortierung/1751197#m1751197