Vinzenz Mai: MySQL: GROUP-BY und Ergebnisse in nicht gruppierten Spalten

Beitrag lesen

Hallo

Das Select-Statement zum Anzeigen der Beitragsübersicht mit "Count" der Antworten auf jedes Topic produziet auf meinem Mac Mini zuhause erwartungsgemäße Ergebnisse,

unvorhersagbare Ergebnisse, sagt das Handbuch :-)

wenn ich meine Schöpfung jedoch auf meinen Test-Webserver im Netz lade, auf dem wohl eine ältere MySQL Version läuft, baut die Group-By Klausel wohl plötzlich "Mist".

Nö. Zulässige Ergebnisse, sagt das Handbuch (gleiche Seite).

SELECT  
    prb_request.request_number,  
    prb_request.hierarchy_location,  
    request,  
    author,  
    category,  
    last_name,  
    first_name,  
    date_format(date_posted, '%d.%m.%y, %k:%i Uhr') AS fmt_time,  
    COUNT(*) - 1 AS CommentCount  
FROM (prb_request  
INNER JOIN prb_user  
ON prb_user.login_name LIKE prb_request.author)  
LEFT JOIN prb_request_category ON prb_request.request_number  
LIKE prb_request_category.request_number  
GROUP BY IF(LEFT(hierarchy_location,LOCATE('.',hierarchy_location) - 1) = '',hierarchy_location, LEFT(hierarchy_location, LOCATE('.', hierarchy_location) - 1))  
ORDER BY irgendwas

Da Du nach keiner einzigen vorhandenen Spalte gruppierst, sind die Ergebnisse in allen Feldern außer COUNT(*) zufälliger Natur.

Erwartungsgemäss sollte dies eine Tabelle sämtlicher Themen aller Kategorien mit Spalte für Anzahl der Antworten ausgeben.

Wieso?

Da es auf meinem Rechner zuhause ja erwartungsgemäß klappt,

zufälligerweise das ergibt, was Du gerne hättest.

gehe ich davon aus, dass mein Statement so schonmal in Ordnung ist,

Du irrst.

allerdings würde ich gerne die Abwärtskompatibilität zu älteren MySQL Versionen herstellen.

Weiß jemand vielleicht etwas zu dieser "Thematik" wo die Group-By Klausel ein Bündel von Zeilen unter EINER verkehrten Zeile zusammenfasst?

Du siehst das falsch. GROUP BY liefert zurück, was es zurückliefern darf. Ja, ich habe hier im Forum die Schlampigkeit von MySQL bezüglich solcher SQL-Anweisungen wie Deinem bemängelt. Ich sehe dies nicht als Feature sondern als Bug. Jedes andere mir bekannte Datenbankmanagementsystem weist ein solches Statement als fehlerhaft zurück, in dem nicht nach allen Spalten gruppiert wird, in denen _keine_ Aggregatfunktion verwendet wird.

Was kann man dagegen tun?

Das hängt von Deiner MySQL-Version ab. Ist sie älter als 4.1, dann hast Du Pech gehabt. Ist sie mindestens eine 4.1, so könntest Du Dein Ergebnis höchstwahrscheinlich mit einem Subselect erreichen.

Damit man Dir besser helfen kann, gib' Deine Tabellen mit ein paar Beispieldatensätzen an  - und das erwartete Ergebnis. Und natürlich Deine MySQL-Version :-)

Freundliche Grüße

Vinzenz