2016-07-22 5 views
0

Also habe ich gerade aktualisiert auf die neueste MySQL, und ich bekomme diese Fehlermeldung:Nach der Aktualisierung von MySQL, seltsamen Fehler immer JOIN von 'sql_mode = only_full_group_by'

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'stats.playtime.date' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Meine Tabelle:

id int(255) 
date datetime 

Meine Frage:

SELECT DATE(date) + INTERVAL 1 DAY, COUNT(DISTINCT id) 
FROM playtime 
GROUP BY DATE(date) 

Alles, was es tut, ist mir sagen, wie viele Benutzer zuerst zu einem bestimmten Zeitpunkt verbunden, so dass ich Zeigen Sie diese Daten in einem Diagramm an.

ich nicht sicher genau das bin, was ist mit dieser Abfrage falsch? Ich habe gehört, dass es in dieser neuen Version von MySQL neue Syntaxregeln geben muss, aber ich bin mir nicht sicher, wie ich ihnen bei dieser Abfrage genau folgen soll. Irgendwelche Ideen?

Zweites Beispiel verursacht das gleiche Problem:

Tabelle:

id     int(11) 
user    varchar(255) 
course    varchar(255) 
course_difficulty varchar(255) 
time_taken   int(255) 

Abfrage:

SELECT course, course_difficulty, time_taken 
FROM minigame 
WHERE user = 'abc' 
GROUP BY course 
ORDER BY time_taken LIMIT 50 
+0

@FirstOne Ich bin in der Lage, diese Art von Abfrage auszuführen, ohne dass auf meine beiden Test- und Live-Server (ohne Berücksichtigung die separate Ausgabe wie oben erwähnt) zu tun. Wird das aus anderen Gründen verwendet? Oder nur für die Syntax, damit die Abfrage ausgeführt werden kann? – user3420034

+2

'date' ist kein reserviertes Wort, stellare Idee, [wahrscheinlich nicht] (http://i.imgur.com/oUwa6hG.jpg) – Drew

+0

' DESC' in 'group by' Klausel? Sind Sie sicher, dass Sie 'grup by' und nicht' order by' verwenden möchten? – zajonc

Antwort

3

Im ersten Beispiel ist der MySQL-Optimierer nicht schlau genug, um zu erkennen, dass der Ausdruck DATE(date) + INTERVAL 1 DAY funktional von DATE(date) abhängig ist. Die Problemumgehung dafür besteht darin, den gesamten Ausdruck in die GROUP BY-Klausel aufzunehmen.

Im zweiten Beispiel wird MySQL über die nicht-Aggregate in der Liste SELECT Kneifen der BY-Klausel nicht in der Gruppe sind, wiederum, weil sie nicht funktionell abhängig sind.

Hier einige Beispieltabellendaten, die die Gründe für die Fehler zeigt:

id user course 
-- ---- ------ 
11 fee win101 
12 fi  win101 
13 fo  win101 

Wenn wir diese Abfrage auszuführen versuchen:

SELECT t.course, t.user 
    FROM mytable t 
GROUP BY t.course 

Es gibt drei mögliche Werte, die für user zurückgegeben werden könnten ... Gebühr, fi oder fo.

MySQL ermöglicht die Abfrage auszuführen, wenn wir ein Aggregat Ausdruck anstelle der Spalte. In diesem Beispiel könnten wir MIN (t.user) oder MAX (t.user) verwenden, und MySQL würde "fee" bzw. "fo" zurückgeben.

MySQL Abfrage:

SELECT t.course 
    , MIN(t.user) AS min_user 
    , MAX(t.user) AS max_user 
    , COUNT(1) 
    FROM mytable t 
GROUP BY t.course 
1

Die COUNT(DISTINCT id) ist eine Aggregationsfunktion so in select-Klausel zu sein, es ist erlaubt mit group by. Aber die DATE(date) + INTERVAL 1 DAY ist keine Aggregationsfunktion und es erscheint nicht in group by cluase so ist dies ein Grund Ihres Fehlers.

Um dieses Problem zu lösen Sie nicht aggregiert Spalte in group by Klausel wie in dieser Abfrage

SELECT DATE(`date`) + INTERVAL 1 DAY, COUNT(DISTINCT id) 
FROM playtime 
GRUP BY DATE(`date`) + INTERVAL 1 DAY 

Mehr Informationen über group by und Aggregationsfunktionen finden Sie [hier] hinzufügen sollten. 1

+0

Danke für die Info! Ich habe gerade eine zweite Abfrage hinzugefügt, die Probleme verursacht, bei denen ich keine Operationen in SELECT oder GROUP BY verwende. Irgendwelche Ideen dazu? – user3420034

+0

Aber die Erklärung ist die gleiche - Ihre Spalten 'course_difficulty' und' time_taken' sollten auf 'grup by' -Klausel erscheinen oder Sie müssen sie mit einer Aggregationsfunktion wie' max', 'sum' usw. verwenden. – zajonc

Verwandte Themen