Il s'agit d'une erreur courante pour les utilisateurs de MySQL. Dans MySQL 5.7, la base de données applique par défaut la sémantique standard que la plupart des autres bases de données SQL appliquent depuis des années.
La règle est que chaque colonne de votre liste de sélection doit être l'une des suivantes :
- Nommé dans la clause GROUP BY ; c'est-à-dire que c'est ce que vous regroupez.
- Dans une fonction d'agrégation comme MIN, MAX(), SUM(), GROUP_CONCAT(), etc.
- Fonctionnellement dépendant de la colonne que vous regroupez (il s'agit de l'extension de MySQL au comportement SQL standard, et les autres bases de données SQL ne le prennent pas nécessairement en charge).
Dans votre requête (je développerai votre SELECT *
):
select user_id, feature_key, feature_value from user_features
where user_id = 1
group by feature_key
Vous regroupez par feature_key, mais cela signifie que les autres colonnes ne respectent pas les règles que j'ai décrites ci-dessus.
Voici un moyen de résoudre ce problème :
select MAX(user_id), feature_key, GROUP_CONCAT(feature_value)
from user_features
where user_id = 1
group by feature_key
Il peut sembler redondant d'utiliser MAX(user_id)
car il n'y a qu'une seule valeur possible basée sur la condition de la clause WHERE. Mais il n'y a pas de mal non plus. MIN(user_id)
fonctionnerait également.
Voir aussi mes réponses passées sur cette même erreur :