dressa
Goto Top

MYSQL 8 Group By und Order BY

Hallo miteinander.

Ich habe vor langer langer Zeit eine Webseite programmiert.
Der Provider hat nun die MYSQ Version auf die 8.019 erhöht.

Jetzt funktioniert meine Abfrage mit gruppierungen und sortierungen nicht mehr.

Habe mich auch informiert direkt bei MYSQL aber egal wie ich es lese ich verstehe den Text nicht.

Meine alte abfrage sah so aus
SELECT monat FROM sonntagsgedanke WHERE status=1 GROUP BY monat ORDER BY sortierung DESC

das funktioniert nun in der neuen Version, aber die Sortierung stimmt nicht mehr
SELECT monat FROM sonntagsgedanke group by monat

wenn ich noch ORDER BY dazu nehme funktioniert sie nicht mehr.


Kann mir mal jemand auf die Sprünge helfen was ich genau unter MYSQL 8 machen muss das die Gruppierung und Sortierung funktionieren ?

Hab im Manual gelesen ich müsse einen Join verwenden, was aber bei einer Datenbank keinen Sinn macht.
Ich versteh wirklich gerade nur Bahnhof.

Content-Key: 589108

Url: https://administrator.de/contentid/589108

Ausgedruckt am: 29.03.2024 um 08:03 Uhr

Mitglied: em-pie
em-pie 19.07.2020 um 16:54:41 Uhr
Goto Top
Moin,

mach mal ein
SELECT monat, Sortierung FROM sonntagsgedanke WHERE status=1 GROUP BY monat ORDER BY sortierung DESC

Ansonsten poste mal die Fehlermeldung


Gruß
em-pie
Mitglied: dressa
dressa 19.07.2020 um 19:40:47 Uhr
Goto Top
danke für deine Hilfe.

Leider funktioniert auch dein Beispiel nicht.

Hier die Fehlermeldung von MySQL

MySQL meldet: Dokumentation

#1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'dbxxxx.sonntagsgedanke.sortierung' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Mitglied: em-pie
em-pie 19.07.2020 um 20:06:15 Uhr
Goto Top
Die Meldung ist sprechend.
Lasse noch einmal das „Sortierung“ weg und poste dann die Meldung.
Mit der kann man in 99% der Fälle das Problem identifizieren und beheben
Mitglied: dressa
dressa 19.07.2020 um 20:20:55 Uhr
Goto Top
Ok hab ich gemacht.
Die Fehlermeldung ist genau die gleiche.

SELECT monat, Sortierung FROM sonntagsgedanke WHERE status=1 GROUP BY monat


MySQL meldet:

#1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db12185050-1.sonntagsgedanke.sortierung' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Mitglied: dressa
dressa 19.07.2020 um 20:33:38 Uhr
Goto Top
ich muss mich noch korrigieren.

Mein Hoster hat mir geschrieben das auf 8.019 upgradet wurde.
in den PHP Info steht aber die Version 5.0
Mitglied: BernhardMeierrose
BernhardMeierrose 19.07.2020 um 21:00:54 Uhr
Goto Top
Moin

sql_mode=only_full_group_by bewirkt, dass alle im SELECT aufgeführen Spalten auch in der GROUP BY auftauchen müssen bzw funktional abhängig sind.
Wenn Du also GROUP BY monat, Sortierung nimmst, sollte das gehen. Alternativ halt den sql_mode ändern

Gruß
Bernhard
Mitglied: dressa
dressa 19.07.2020 um 21:53:56 Uhr
Goto Top
Wenn ich das mit der Funktionalität richtig verstanden hab, muss jede Spalte im Select drin stehen die ich zum gruppieren brauche.

Deshalb funktioniert auch
SELECT monat FROM sonntagsgedanke where status=1 GROUP BY monat

Wenn ich aber die Sortierung auch mitgebe, bekomme ich die genau gleiche Fehlermeldung.
Und die Spalte Sortierung will ich ja nicht in der Gruppierung drin haben.
Also so gehts nicht.
SELECT monat, sortierung FROM sonntagsgedanke where status=1 GROUP BY monat ORDER BY sortierung
Mitglied: em-pie
em-pie 19.07.2020 um 22:01:21 Uhr
Goto Top
Du vermischt in beiden Statements Dinge.

Dein Vorhaben, nach Monat zu Gruppieren und dann nach der Sortierung zu sortieren ergibt keinen Sinn:
Du willst alles nach Monaten gruppieren, und das Feld Sortierung wird dabei geschluckt, denn im März könnte es ja verschiedene Unhalte für Soertierung geben. Dennoch willst du danach sortieren.

Du musst die Sortierung zwangsweise ins SELECT, GROUP BY und ORDER BY aufnehmen. Ansonsten arbeite mit MAX(Sortierung) o. ä. Im Select-Statement
Mitglied: dressa
dressa 19.07.2020 um 23:15:19 Uhr
Goto Top
ok.

wenn ich die beiden Spalten Monat und Sortieren in GROUP BY und ORDER BY einfüge bekomme ich zwar ein Ergebnis aber das ist gar nicht das was ich will.

Das Ergebnis beinhaltet mehrere male alle Monate.
Ich komme auf das gleiche Ergebnis wie wenn ich GROUP BY entferne.

Die Logik dahinter habe ich nicht verstanden.

Ich versuche es auf einen anderen Weg.
Bei der Abfrage ab 5.0 muss ich passen.
Mitglied: it-frosch
it-frosch 20.07.2020 um 08:07:22 Uhr
Goto Top
Hallo dressa,

SELECT monat FROM sonntagsgedanke WHERE status=1 GROUP BY monat ORDER BY sortierung DESC
Wahrscheinlich ist MySQL in der Version 8 mehr in Richtigung SQL Standard gegangen. face-wink
Bei MSSQL hat so etwas noch nie funktioniert.

Was willst du mit deiner Abfrage denn erreichen?
Ohne deine Tabellen und dein Ziel genau verstanden zu haben, hilft es sich schwer. face-wink

grüße vom it-frosch
Mitglied: dressa
dressa 20.07.2020 aktualisiert um 21:17:30 Uhr
Goto Top
hallo it-frosch.

das Problem von der Abfrage konnte ich mit einer fixen Liste erledigen.
Am Anfang als die Seite gemacht wurde und Inhalt geschrieben wurde musste ich die Abfrage der Monate etwas "dynamisch" schreiben.
Jetzt ist die Abfrage sinnlos, da alle Monate Inhalte haben.
Deshalb hab ich die Liste er auszuwählenden Monate fix eingegeben.

Ich habe noch nicht ganz 100% die Logik hinter dieser Abfrage kapiert, konnte aber dennoch eine weitere Abfrage die nicht funktionierte reparieren.

Aber jetzt stehe ich bei einer an und weiss was der Fehler ist.....aber wie das neu erschaffene Problem lösen ?????


Es ist eine Datenbankabfrage in einem Archiv, über alle Einträge.
Ich möchte in einem Pulldownmenü alle Jahre anzeigen lassen von denen ein Eintrag vorhanden sind ?

Das hab ich bis jetzt so abgefragt.
SELECT datum FROM termine WHERE status=1 GROUP BY YEAR(datum) DESC
Das Ergebnis war dann: 2005, 2007,2008,2009 usw.

Das Problem ist wieder das Gruppieren des Datums aber nur der Jahre.

Das würde gehen
SELECT datum FROM termine WHERE status=1 GROUP BY datum
hab aber dann das gesamte Datum mit Tag und Monat und nicht nur das Jahr.

Dann hab ich es so probiert:
SELECT YEAR(datum) FROM termine WHERE status=1 GROUP BY datum
Da wird dann auch nur das Jahr ausgegeben, aber eben mehrmals, weill die Gruppierung sich nicht mehr auf das Jahr bezieht sondern auf das ganze Datum.


OK etwas weitergekommen:

So funktioniert auch die Gruppierung nur mit dem Jahr:
SELECT YEAR(datum) FROM termine WHERE status=1 GROUP BY YEAR(datum)

Jetzt muss die Sortierung noch funktionieren, aber DESC kann ich nicht benutzen
SELECT YEAR(datum) FROM termine WHERE status=1 GROUP BY YEAR(datum) DESC

FEHLER: #1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei 'DESC LIMIT 0, 25' in Zeile 1
Mitglied: dressa
dressa 20.07.2020 um 21:48:48 Uhr
Goto Top
Sogar im Referenzhandbuch zu MYSQL 5.1 steht das DES und ASC verwendet werden dürfen.

AUSZUG:
Trotzdem können Sie Einfluss auf die Sortierreihenfolge nehmen. GROUP BY sortiert in MySQL Ergebnisse, und Sie können die Schlüsselwörter ASC und DESC ausdrücklich für Spaltennamen in der GROUP BY-Liste angeben, um die Sortierfolge für einzelne Spalten zu spezifizieren.
Mitglied: dressa
dressa 20.07.2020 aktualisiert um 23:46:37 Uhr
Goto Top
also so funktionierts,
aber ob das konform nach Referenzhandbuch ist ???
Hab jetzt einfach mal rumprobiert bis es geklappt hat.

SELECT YEAR(datum) FROM termine WHERE status=1 GROUP BY YEAR(datum) ORDER BY YEAR(datum) DESC
Mitglied: em-pie
em-pie 20.07.2020 um 23:51:28 Uhr
Goto Top
Und wo ist jetzt deine Spalte „Sortierung“?
Um die ging es dir doch im Ausgangspost!?
Mitglied: dressa
dressa 20.07.2020 um 23:58:46 Uhr
Goto Top
ja aber das hat sich für den Ausgangspost erledigt.
Hab da was fixes Programmieren können, und da brauchte ich dann keine Datenbankabfrage.

Ev. werde ich noch eine haben wo das Sortieren nochmal ein Thema werden wird.
Aber das schaue ich erst morgen an.
Mitglied: it-frosch
it-frosch 21.07.2020 um 13:26:19 Uhr
Goto Top
SELECT YEAR(datum) FROM termine WHERE status=1 GROUP BY YEAR(datum) ORDER BY YEAR(datum) DESC

Das klappt nicht nur, das siehst auch gut aus. face-wink

grüße vom it-frosch
Mitglied: dressa
dressa 21.07.2020 um 20:46:01 Uhr
Goto Top
ok. dann kann ich damit ja schon mal etwas anfangen.


habe nun noch ein verzwicktes Problem:
Es geht auch wieder um die Gruppierung und Sortierung zusammen.
Dazu brauche ich Infos aus weiteren Spalten.


Die Ausgangslage:
Es gibt eine Tabelle in der Links unter verschiedenen Rubriken aufgelistet werden.
Ich habe ein Admin-Tool Entwickelt damit alles vom der Kollegin verwaltet werden kann.
Die Tabelle sieht so aus das es eine ID, den Rubriktitel, den Link, einen Namen zum Link und eine sortierung Spalte gibt:

| id | titel | link | name | sortierung | status
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 1 | titel 1 | link 1 | name 1 | 10 | 1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 2 | titel 2 | link 2 | name 2 | 20 | 1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 3 | titel 1 | link 3 | name 3 | 10 | 1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 4 | titel 2 | link 4 | name 4 | 20 | 1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 5 | titel 3 | link 5 | name 5 | 30 | 1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Jetzt will ich eine Abfrage machen die mir alle Titel gruppiert damit ich die Titel nur einmal in einem PulldownMenü habe.
Falls der Eintrag bearbeitet werden muss brauche ich dazu die ID und die nummer der sortierung.

Und genau diese Abfrage krieg ich jetzt nicht hin.

Das ist die alte die funktionierte:
SELECT * FROM link GROUP BY titel ORDER BY sortierung ASC

Wenn ich nur den Titel auslese und gruppiere funktioniert das auch
SELECT titel FROM link GROUP BY titel

wenn ich nun im SELECT die ID mit dazu nehme mekkert er wieder mit dieser blöden Group-Fehlermeldung, obwohl die ID nichts in der Gruppierung zu suchen hat.
SELECT id, titel FROM link GROUP BY titel
FEHLER: #1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db12185050-1.link.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

dazu kommt das auch noch die sortierung auch mit im SELECT stehen muss.
Wie kriege ich das wieder hin das nach titel gruppiert wird und auch andere Werte aus anderen Spalten dazu übernommen werden ??
Mitglied: em-pie
em-pie 21.07.2020 um 21:29:16 Uhr
Goto Top
Jung,

Lies dich bitte mal in GROUP BY ein:
https://dev.mysql.com/doc/refman/8.0/en/group-by-modifiers.html


Du kannst nicht gruppieren, wenn du die zu gruppierenden Felde nicht im SELECT-Statement einbindest und umgekehrt.

Du musst das Regelkonforme machen
Und wenn deine Tabellen eindeutig sind, ist dein Group by id, Title unique
Mitglied: dressa
dressa 21.07.2020 um 22:37:25 Uhr
Goto Top
Die Hausaufgabe habe ich schon lange gemacht.

Nur versehen tu ich es einfach nicht.
Oder besser gesagt meine Logik die versteht es nicht.

Gut dann füge ich beide Spalten in das SELECT und in GROUP BY
also so ein.
SELECT titel, id FROM link GROUP BY titel, id

Die Abfrage funktioniert, ist also Regelkonform,
aber sie gibt jetzt alle Einträge aus
Also von obigen Beispiel alle 5 Zeilen.
Sie sind einfach nach Titel und innerhalb des gleichen Titels nach der ID sortiert:

| id | titel
- - - - - - -
| 1 | titel 1
- - - - - - - -
| 3 | titel 1
- - - - - - - -
| 2 | titel 2
- - - - - - - -
| 4 | titel 2
- - - - - - - -
| 5 | titel 3
- - - - - - - -

und das ist nicht das gewünschte Ergebniss.
Ich möchte das nur dieses Ergebniss kommt.
Titel 1 bis 3 zusammen mit den Spalten "id"

| id | titel
- - - - - - - -
| 1 | titel 1
- - - - - - - -
| 2 | titel 2
- - - - - - - - -
| 5 | titel 3
- - - - - - - - -
Mitglied: BernhardMeierrose
BernhardMeierrose 21.07.2020 um 22:45:44 Uhr
Goto Top
Woher soll denn der SQL-Server wissen, dass Du bei Titel 1 die iD 1 stehen haben willst und nicht die ID 3 ?

Gruß
Bernhard
Mitglied: dressa
dressa 21.07.2020 um 22:49:46 Uhr
Goto Top
ok..

danke
jetzt denke ich, es verstanden zu haben.
Die ID ist in dem Moment der Abfrage noch egal.

Dann ist das meine Lösung:
SELECT titel, MIN(id), MIN(sortierung) FROM link GROUP BY titel
Mitglied: TheJoker2305
TheJoker2305 26.08.2020 um 16:37:06 Uhr
Goto Top
Hallo,

warum oben bei einem

SELECT datum from ....
ein Gruop sein muss entzieht sich meinem Verständnis.

Bezüglich des Titelproblems sollte ein DISTINCT eingentlich die Lösung sein.

SELECT DISTINCT titel FROM link

Was soll denn wirklich ausgegeben werden?

Greetz
thejoker2305