Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment GROUP BY DESC sélectionne sa commande ?

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 le SELECT 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).