Dette er en almindelig fejl for MySQL-brugere. I MySQL 5.7 håndhæver databasen som standard den standardsemantik, som de fleste andre SQL-databaser har håndhævet i årevis.
Reglen er, at hver kolonne i din valgliste skal være en af:
- Navnet i GROUP BY-sætningen; dvs. det er, hvad du grupperer.
- Inde i en aggregeret funktion som MIN, MAX(), SUM(), GROUP_CONCAT() osv.
- Funktionelt afhængig af den kolonne, du grupperer efter (dette er MySQL's udvidelse til standard SQL-adfærd, og andre SQL-databaser understøtter ikke nødvendigvis dette).
I din forespørgsel (jeg udvider din SELECT *
):
select user_id, feature_key, feature_value from user_features
where user_id = 1
group by feature_key
Du grupperer efter feature_key, men det betyder, at de andre kolonner ikke overholder reglerne, jeg beskrev ovenfor.
Her er en måde at løse det på:
select MAX(user_id), feature_key, GROUP_CONCAT(feature_value)
from user_features
where user_id = 1
group by feature_key
Det kan virke overflødigt at bruge MAX(user_id)
da der kun er én mulig værdi baseret på WHERE-sætningsbetingelsen. Men der er heller ingen skade. MIN(user_id)
ville også virke.
Se også mine tidligere svar på denne samme fejl: