Rolf B: Warum spinnt meine Sortierung?

Beitrag lesen

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