Dies ist ein häufiger Fehler für MySQL-Benutzer. In MySQL 5.7 erzwingt die Datenbank standardmäßig die Standard-Semantik, die die meisten anderen SQL-Datenbanken seit Jahren erzwingen.
Die Regel ist, dass jede Spalte in Ihrer Auswahlliste eine der folgenden sein muss:
- In der GROUP BY-Klausel benannt; d.h. es ist das, was Sie gruppieren.
- Innerhalb einer Aggregatfunktion wie MIN, MAX(), SUM(), GROUP_CONCAT() usw.
- Funktional abhängig von der Spalte, nach der Sie gruppieren (dies ist MySQLs Erweiterung des Standard-SQL-Verhaltens, und andere SQL-Datenbanken unterstützen dies nicht unbedingt).
In Ihrer Abfrage (ich erweitere Ihre SELECT *
):
select user_id, feature_key, feature_value from user_features
where user_id = 1
group by feature_key
Sie gruppieren nach feature_key, aber das bedeutet, dass die anderen Spalten nicht den oben beschriebenen Regeln entsprechen.
Hier ist eine Möglichkeit, das Problem zu beheben:
select MAX(user_id), feature_key, GROUP_CONCAT(feature_value)
from user_features
where user_id = 1
group by feature_key
Es mag überflüssig erscheinen, MAX(user_id)
zu verwenden da basierend auf der Bedingung der WHERE-Klausel nur ein Wert möglich ist. Aber es schadet auch nicht. MIN(user_id)
würde auch gehen.
Siehe auch meine früheren Antworten zu demselben Fehler: