Jest to częsty błąd dla użytkowników MySQL. W MySQL 5.7 domyślnie baza danych wymusza standardową semantykę, którą większość innych baz danych SQL wymusza od lat.
Zasada jest taka, że każda kolumna na liście wyboru musi być jedną z:
- Nazwany w klauzuli GROUP BY; tj. to jest to, co grupujesz.
- Wewnątrz funkcji agregującej, takiej jak MIN, MAX(), SUM(), GROUP_CONCAT() itp.
- Funkcjonalnie zależne od kolumny, według której grupujesz (jest to rozszerzenie MySQL do standardowego zachowania SQL, a inne bazy danych SQL niekoniecznie to obsługują).
W twoim zapytaniu (rozwinię twój SELECT *
):
select user_id, feature_key, feature_value from user_features
where user_id = 1
group by feature_key
Grupujesz według feature_key, ale oznacza to, że inne kolumny nie są zgodne z zasadami opisanymi powyżej.
Oto sposób, aby to naprawić:
select MAX(user_id), feature_key, GROUP_CONCAT(feature_value)
from user_features
where user_id = 1
group by feature_key
Użycie MAX(user_id)
może wydawać się zbędne ponieważ na podstawie warunku klauzuli WHERE możliwa jest tylko jedna wartość. Ale też nie ma nic złego. MIN(user_id)
również zadziała.
Zobacz także moje wcześniejsze odpowiedzi dotyczące tego samego błędu: