SELECT * FROM my_table GROUP BY section_identifier
est un SQL
invalide requête.
Comment GROUP BY
fonctionne ?
Prenons la requête ci-dessus et voyons comment GROUP BY
œuvres. Le moteur de base de données sélectionne d'abord toutes les lignes qui correspondent à WHERE
clause. Il n'y a pas de WHERE
clause dans cette requête ; cela signifie que toutes les lignes du tableau sont utilisées pour générer le jeu de résultats.
Il regroupe ensuite les lignes à l'aide des expressions spécifiées dans le GROUP BY
clause :
+----+--------------------+----------------------+----------+
| id | section_identifier | option_identifier | store_id |
+----+--------------------+----------------------+----------+
| 17 | header | header_option_one | 1 |
| 23 | header | header_option_three | 0 |
+----+--------------------+----------------------+----------+
| 18 | footer | footer_option_one | 0 |
+----+--------------------+----------------------+----------+
| 19 | homepage_feature | homepage_feature_one | 0 |
| 25 | homepage_feature | homepage_feature_one | 1 |
+----+--------------------+----------------------+----------+
J'ai marqué les groupes dans la liste ci-dessus pour que tout soit clair.
À l'étape suivante, à partir de chaque groupe, le moteur de base de données produit une seule ligne . Mais comment ?
Le SELECT
clause de votre requête est SELECT *
. *
représente la liste complète des colonnes du tableau ; dans ce cas, SELECT *
est une manière courte d'écrire :
SELECT id, section_identifier, option_identifier, store_id
Analysons les valeurs de la colonne id
pour le premier groupe. Quelle valeur le moteur de base de données doit-il choisir pour id
? 17
ou 23
? Pourquoi 17
et pourquoi 23
?
Il n'a aucun critère à privilégier 17
plus de 23
. Il en choisit juste un (probablement 17
mais cela dépend de beaucoup de facteurs internes) et va un.
Il n'y a aucun problème pour déterminer la valeur de section_identifier
. C'est la colonne utilisée pour GROUP BY
, toutes ses valeurs dans un groupe sont égales.
Le dilemme de choix se reproduit sur les colonnes option_identifier
et store_id
.
Selon le standard SQL
votre requête n'est pas valide et elle ne peut pas être exécutée. Cependant, certains moteurs de base de données l'exécutent comme décrit ci-dessus. Les valeurs des expressions qui ne le sont pas (au moins une des valeurs ci-dessous) :
- utilisé dans le
GROUP BY
clause ; - utilisé avec
GROUP BY
fonctions d'agrégation dans leSELECT
clause ; - fonctionnellement dépendant des colonnes utilisées dans le
GROUP BY
clause ;
sont indéterminés.
Depuis la version 5.7.5
, MySQL
implémente la détection des dépendances fonctionnelles
et, par défaut, il rejette un GROUP BY
invalide requête comme la vôtre.
Comment le faire fonctionner
Ce n'est pas clair pour moi comment vous voulez obtenir le jeu de résultats. Quoi qu'il en soit, si vous voulez obtenir des lignes de la table, alors GROUP BY
n'est pas la bonne façon de le faire. GROUP BY
ne le fait pas sélectionner des lignes d'une table, il génère de nouvelles valeurs en utilisant les valeurs de la table. Une ligne générée par GROUP BY
, la plupart du temps, ne correspondent à aucune ligne de la table source.
Vous pouvez trouver une solution possible à votre problème dans cette réponse . Vous devrez écrire la requête vous-même après avoir lu et compris l'idée (et vous aurez très clairement compris comment les lignes "gagnantes" doivent être sélectionnées).