MySQL Lists are EOL. Please join:

List:German« Previous Message
From:Frank Rasche Date:January 15 2019 10:53pm
Subject:Re: MySQL Update 5.7, GROUP BY
View as plain text  
Hallo Bert,

naja, das Problem ist genau dieses: Du gruppierst nach url, die 
restlichen Spalten kommen dann nach gusto.

Zum Beispiel, diese Query funktioniert:

SELECT COUNT(id), searchengines.url
FROM searchengines GROUP BY url ORDER BY count(id)

Das funktioniert nicht:

SELECT COUNT(id), searchengines.url, searchengines.id
FROM seachengines GROUP BY url ORDER BY count(id)

Der Punkt ist: wenn du bspw. 4 Zeilen mit url = "crawler.net" in deiner 
Tabelle hast, welchen Wert erwartest du bei id?

Die id der ersten Zeile mit diesem url-Wert?
Die id der zweiten Zeile?
oder irgendeine andere?

De fakto sollte in diesem Fall die Spalte id gar nicht wirklich genutzt 
werden, weil sie lediglich auf eine beliebige Zeile deiner Tabelle 
verweist nach der Gruppierung nach URL.

Das ist der Stolperstein vor dem dich MySQL bewahren will.
Das Gleiche gilt auch für alle anderen Spalten die du zusätzlich 
selektierst. Entweder steht in den restlichen Spalten zu jedem "url" 
wert immer die selben anderen Werte, dann können die auch problemlos in 
die GROUP By Clause hinein. Oder eben nicht, dann sollte man sie nicht 
selektieren, weil sie im Grunde "zufällig" sein könnten.

Je nachdem, was du mit searchengines.id vorhast, solltest du schauen ob 
du sie überhaupt brauchst.

Um dem "willkürlichem" id-Feld zu umgehen, könnte man bspw. die letzte 
(durch auto-increment die höchste) id selektieren:

SELECT COUNT(id), MAX(id) as LastId, searchengines.url FROM 
searchengines GROUP BY url ORDER BY count(id)

Dann würdest du zu jeder Zeile url auch die letzte id bekommen.
Oder mit MIN(id) die kleinste.... oder... naja, ich hoffe du verstehst 
was ich meine. Aber solange du nicht MySQL sagst, welche Id du nach der 
Gruppierung von "url" haben willst, wird er Fehler auspucken.

Wenn du sagst, da sind noch andere Spalten, die du ausliest, dann gib 
uns mal ein Beispiel.

Die anderen Möglichkeiten wurden ja schon erwähnt:

Siehe
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-changes

Wenn du die Query nicht abändern kannst, wirf einen Blick auf 
ANY_VALUE() oder du änderst den SQL mode (also ONLY_FULL_GROUP_BY 
deaktivieren, aber andere nützliche SQL Modes kann man natürlich 
aktiveren/aktiviert lassen).

HTH
Frank

Am 15.01.2019 um 21:28 schrieb BG:
> Hallo Roland,
> 
>   
> 
> danke, nein es werden in der gleichen Abfrage noch andere Spalten ausgelesen
> .. daher hatte ich die Anfrage wie MySQL 5.7 es erwartet im GROUP BY
> statement um die id ergänzt. Die Afrage funktioniert dann auch, allerdings
> werden mir dann anstatt der bisher gruppierten Einträge die einzelnen
> Einträge angezeigt, wegen GROUP BY url UND id!
> 
>   
> 
> Die id ist numerisch und fortlaufend (auto increment). Die url ist nicht
> einzigartig und kommt häufiger vor, ist also doppelt vorhanden.
> 
> Ich habe noch immer keine Lösung!
> 
>   
> 
> Grüße
> 
> Bert
> 
>   
> 
> Von: Roland Müller [mailto:rolmur1@stripped]
> Gesendet: Dienstag, 15. Januar 2019 21:22
> An: BG; mysql-de@stripped
> Betreff: MySQL Update 5.7, GROUP BY
> 
>   
> 
> Hallo,
> 
>   
> 
> deine ursprüngliche Abfrage ist und war illegal in Standard SQL:
> 
> *	in der SELECT Liste dürfen nur Felder/Spalten stehen, die auch in
> GROUP BY verwendet werden.
> *	'url' aus deinem Beispiel ist dann illegal in der ersten Abfrage.
> 
> https://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html
> 
> MySQL 5.5 erlaubte trotzdem die Verwendung von Felder, die nicht in GROUP BY
> stehen, allerdings hat das nur Sinn, wenn der jeweilige Wert innerhalb der
> Gruppe immer derselbe ist: jede Zeile mit derselben id müsste dann immer
> dieselbe url haben. Das ist offensichtlich bei deinen Daten nicht der Fall,
> da ja die neue Abfrage nicht das gewünschte Ergebnis bringt.
> 
> Eine Antwort auf deine Frage ist schwierig ohne zu wissen, was das Feld id
> eigentlich bedeutet? Wenn du nur die Anzahl der Zeilen pro URL haben willst,
> könnte die Abfrage so aussehen:
> 
> *	SELECT url, COUNT(*) AS anzahl
> *	FROM searchengines
> *	GROUP BY url
> *	ORDER BY COUNT(*)
> 
> Gruss,
> 
> Roland
> 
> On 1/14/19 5:53 PM, BG wrote:
> 
> Hi,
>   
>   
>   
> ich habe eine DB auf 5.7 geupdated .. seither habe ich in einer Abfrage die
> Daten wie folgt aus der DB gelesen und gruppiert ..
>   
>   
>   
> --
>   
> SELECT COUNT(id) AS anzahl, searchengines.*
>   
> FROM searchengines
>   
> GROUP BY url
>   
> ORDER BY COUNT(id)
>   
> DESC LIMIT 10
>   
> --
>   
> Da dies mit 5.7 nicht mehr möglich ist, musste ich die Query anpassen, um
> keine Fehlermedung zu erhalten:
>   
>   
>   
> Expression #2 of SELECT list is not in GROUP BY clause and contains
> nonaggregated column 'db.searchengines.id' which is not functionally
> dependent on columns in GROUP BY clause; this is incompatible with
> sql_mode=only_full_group_by
>   
>   
>   
> Daher habe ich die Abfrage wie folgt geändert ..
>   
> --
>   
> SELECT COUNT(id) AS anzahl, searchengines.id,  searchengines.id,
> searchengines.url,
>   
> FROM searchengines
>   
> GROUP BY url, id
>   
> ORDER BY COUNT(id)
>   
> DESC LIMIT 10
>   
> --
>   
>   
>   
> Jetzt erhalte ich zwar keinen Fehler mehr, allerdings werden die
> Ergebniszeilen nicht gruppiert ausgegeben, sondern einzlen. Wie kann ich die
> Abfrage ändern, damit alle URLs gruppiert nach url ausgegeben werden?
>   
>   
>   
> Danke für die Hilfe!
>   
>   
>   
> Grüße
>   
> Bert
>   
>   
> 
>   
> 
> 

Thread
MySQL Update 5.7, GROUP BYBG14 Jan 2019
AW: MySQL Update 5.7, GROUP BYBG14 Jan 2019
AW: MySQL Update 5.7, GROUP BYBG15 Jan 2019
AW: MySQL Update 5.7, GROUP BYBG15 Jan 2019
  • Re: MySQL Update 5.7, GROUP BYFrank Rasche15 Jan 2019