Comment réparer le code d'erreur MySQL 1055

Publié: 2024-03-28

Le code d'erreur MySQL 1055 concerne l'activation du mode SQL `ONLY_FULL_GROUP_BY`, ce qui affecte la façon dont les clauses GROUP BY sont interprétées et exécutées. Dévoilons ensemble cette erreur, en explorant ses variations, ses causes sous-jacentes et, plus important encore, comment y remédier.

Comprendre l'erreur

Le code d'erreur MySQL 1055 est déclenché dans des circonstances spécifiques impliquant l'instruction SELECT et la clause GROUP BY. Cette exigence vise à éviter les résultats ambigus des requêtes qui regroupent des données.

Concrètement, lorsque vous regroupez des données dans une requête, MySQL doit savoir comment gérer plusieurs lignes appartenant au même groupe pour les colonnes non incluses dans la clause GROUP BY. Le mode `ONLY_FULL_GROUP_BY` est le moyen utilisé par MySQL pour garantir que toute requête groupée est claire et sans ambiguïté en appliquant ces règles.

Ainsi, lorsque vous rencontrez l'erreur 1055, MySQL demande essentiellement des éclaircissements : « Pour les colonnes que vous sélectionnez, dites-moi exactement comment les regrouper (en les incluant dans la clause GROUP BY) ou dites-moi comment agréger les données. (en utilisant des fonctions comme COUNT(), SUM(), etc.).

Comprendre le rôle de ONLY_FULL_GROUP_BY

Ce mode joue un rôle essentiel pour garantir l'exactitude et la fiabilité des opérations de récupération de données, en particulier dans les environnements de bases de données complexes.

Lorsque `ONLY_FULL_GROUP_BY` est activé, MySQL applique une règle claire : si une colonne apparaît dans la liste SELECT d'une requête qui inclut une clause GROUP BY, cette colonne doit satisfaire l'un des critères suivants :

Être une fonction d'agrégation : la colonne est utilisée dans une fonction d'agrégation comme COUNT(), SUM(), MAX(), etc. Ces fonctions résument les données de plusieurs lignes regroupées, produisant un seul résultat par groupe.

Être fonctionnellement dépendant des colonnes GROUP BY : La colonne est fonctionnellement dépendante des colonnes répertoriées dans la clause GROUP BY.La dépendance fonctionnelle signifie que la valeur d'une colonne (la colonne fonctionnellement dépendante) est déterminée de manière unique par la ou les autres colonnes (les colonnes de la clause GROUP BY). En termes plus simples, pour toute valeur donnée de la ou des colonnes GROUP BY, il existe exactement une valeur possible de la colonne fonctionnellement dépendante.

Variations de l'erreur

Voici quelques façons dont cette erreur peut se présenter :

  • Code d'erreur MySQL 1055 : l'expression n°1 de la liste SELECT n'est pas dans la clause GROUP BY et contient la colonne non agrégée « database.table.column » qui ne dépend pas fonctionnellement des colonnes de la clause GROUP BY ; ceci est incompatible avec sql_mode=only_full_group_by
  • Erreur 1055 : ONLY_FULL_GROUP_BY : quelque chose n'est pas dans la clause GROUP BY
  • Erreur SQL (1055) : l'expression de la liste SELECT n'est pas dans la clause GROUP BY
  • SQLSTATE[42000] : erreur de syntaxe ou violation d'accès : 1055

Raisons pour lesquelles cette erreur se produit

Le code d'erreur MySQL 1055 se produit principalement en raison de l'activation du mode SQL `ONLY_FULL_GROUP_BY`, qui exige des règles plus strictes pour les requêtes utilisant la clause GROUP BY. Voici les principales raisons :

Mode SQL `ONLY_FULL_GROUP_BY` activé : Ce mode nécessite que toutes les expressions de liste SELECT apparaissent dans la clause GROUP BY sauf si elles sont agrégées.Il est conçu pour éviter les résultats de requête ambigus.

Colonnes non agrégées dans la liste SELECT : si votre liste SELECT comprend des colonnes non enveloppées dans des fonctions d'agrégation (comme SUM, AVG, MIN, MAX, COUNT) et que ces colonnes ne font pas partie de la clause GROUP BY, MySQL signale cela comme une erreur sous `ONLY_FULL_GROUP_BY`.

Dépendance fonctionnelle : MySQL s'attend à ce que les colonnes de la liste SELECT qui ne sont pas agrégées dépendent fonctionnellement de la clause GROUP BY.La dépendance fonctionnelle signifie qu'une colonne détermine de manière unique une autre colonne. Si cette relation n'est pas respectée, MySQL renvoie l'erreur 1055.

Correction du code d'erreur MySQL 1055

Maintenant que nous avons examiné ce que signifie le code d'erreur 1055 et les causes de l'erreur, examinons quelques façons de corriger cette erreur.

Analyser la requête

La première étape pour résoudre le code d'erreur MySQL 1055 consiste à analyser la requête qui déclenche cette erreur. Cet examen vise à identifier les colonnes répertoriées dans la clause SELECT qui ne sont ni englobées dans la clause GROUP BY ni agrégées. Cette divergence est au cœur du problème, car MySQL, en mode SQL ONLY_FULL_GROUP_BY, exige que toute colonne référencée dans la liste SELECT, et non une fonction d'agrégation, soit déclarée dans la clause GROUP BY pour garantir des résultats sans ambiguïté.

Ajustez votre requête

Pour corriger cette erreur, des ajustements à la requête sont nécessaires. Les modifications se concentrent sur l'alignement avec les stipulations de ONLY_FULL_GROUP_BY. Vous trouverez ci-dessous deux stratégies principales pour assurer la conformité :

Inclure toutes les colonnes non agrégées dans GROUP BY

Inclusion complète : la méthode la plus simple consiste à garantir que chaque colonne apparaissant dans la liste SELECT, qui ne fait pas partie d'une fonction d'agrégation (comme COUNT, AVG, SUM, etc.), est incluse dans la clause GROUP BY.Cette approche est conforme à la norme SQL pour les opérations GROUP BY, garantissant que chaque ligne du jeu de résultats est identifiée de manière unique par les colonnes spécifiées dans la clause GROUP BY.

Exemple

Imaginez que vous ayez une table de base de données nommée « ventes » avec les colonnes « date », « région » et « montant ». Vous souhaitez connaître le montant total des ventes par région, mais votre requête initiale déclenche l'erreur 1055.

Requête initiale (provoquant l'erreur 1055)

 SELECT date, région, SUM(montant)

DES ventes

GROUPER PAR région ;

Cette requête provoque une erreur car « date » n'est pas inclus dans la clause GROUP BY et n'est pas utilisé dans une fonction d'agrégation.

Requête modifiée (résolution de l'erreur 1055)

 SELECT date, région, SOMME (montant)

DES ventes

GROUPER PAR date, région ;

En incluant à la fois « date » et « région » dans la clause GROUP BY, la requête est conforme au mode SQL « ONLY_FULL_GROUP_BY », résolvant ainsi l'erreur.

Utiliser des fonctions d'agrégation pour les colonnes non groupées

Agrégation stratégique : dans les scénarios où l'inclusion de toutes les colonnes non agrégées dans la clause GROUP BY n'est pas pratique ou s'écarte de l'intention de la requête, l'utilisation de fonctions d'agrégation sur les colonnes non regroupées est une alternative efficace.Cette méthode consolide les données non uniques en résultats agrégés significatifs, contournant les restrictions ONLY_FULL_GROUP_BY.

Exemple

Utilisons la même table « ventes ». Supposons que vous souhaitiez sélectionner la région et la dernière date de vente, mais en regroupant uniquement par « région ». L'application d'une fonction d'agrégation à la colonne « date » peut y parvenir sans l'inclure dans la clause GROUP BY.

Requête initiale (provoquant l'erreur 1055)

 SÉLECTIONNER la région, la date

DES ventes

GROUPER PAR région ;

Cette requête échouera car `date` n'est ni dans une fonction d'agrégation ni dans la clause GROUP BY.

Requête modifiée (résolution de l'erreur 1055)

 SELECT région, MAX(date) AS last_sale_date

DES ventes

GROUPER PAR région ;

Dans cette requête modifiée, la fonction `MAX()` est utilisée pour agréger la colonne `date`, sélectionnant ainsi la dernière date de vente pour chaque région. Cela résout l'erreur en respectant les exigences `ONLY_FULL_GROUP_BY`, car `region` est la seule colonne de la clause GROUP BY et `date` est utilisée dans une fonction d'agrégation.

Désactiver le mode SQL `ONLY_FULL_GROUP_BY`

La désactivation du mode `ONLY_FULL_GROUP_BY` dans MySQL peut être considérée comme un dernier recours lorsque la logique de requête exige l'inclusion de colonnes qui ne peuvent pas être ajoutées à la clause GROUP BY ou agrégées.

La désactivation de ce mode peut résoudre des problèmes immédiats tels que le code d'erreur MySQL 1055, mais cela introduit le risque de générer des résultats de requête non déterministes. Ce non-déterminisme peut conduire à ce que les requêtes renvoient des résultats différents dans des conditions différentes, entraînant potentiellement des incohérences de données et des problèmes difficiles à déboguer dans les environnements de production.

Comment désactiver `ONLY_FULL_GROUP_BY`

Pour désactiver temporairement `ONLY_FULL_GROUP_BY` pour la session de base de données en cours, ce qui signifie que la modification ne dure que pendant la durée de la connexion, utilisez la commande SQL suivante :

 SET sql_mode = (SELECT REPLACE (@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

Cette commande supprime sélectivement `ONLY_FULL_GROUP_BY` des modes SQL de la session sans affecter la configuration globale du mode SQL ni impacter les autres sessions de base de données.

À l'échelle mondiale

Pour une solution plus permanente qui affecte toutes les nouvelles connexions au serveur MySQL, vous pouvez modifier le paramètre global du mode SQL avec :

 SET GLOBAL sql_mode=(SELECT REPLACE (@@sql_mode,'ONLY_FULL_GROUP_BY',''));

L'exécution de cette commande modifie le paramètre du mode SQL à l'échelle du serveur en supprimant `ONLY_FULL_GROUP_BY`, appliquant ainsi la modification à toutes les nouvelles connexions après l'exécution. Il est crucial de noter que cela n’affecte pas les connexions existantes et qu’un redémarrage du serveur ou de nouvelles connexions sont nécessaires pour appliquer les modifications globalement.

Meilleures pratiques pour gérer les requêtes MySQL

Lorsque vous traitez des requêtes MySQL, en particulier dans des contextes impliquant des fonctions de regroupement et d'agrégation complexes, il est crucial d'adopter un ensemble de bonnes pratiques. Ces pratiques garantissent non seulement l'efficacité et l'exactitude de vos requêtes, mais aident également à maintenir l'intégrité et la fiabilité de vos données, en particulier lorsque vous naviguez autour de contraintes telles que le mode SQL `ONLY_FULL_GROUP_BY`.

Comprendre les relations entre les données : ayez une compréhension approfondie des relations et des dépendances entre les colonnes de votre base de données.Savoir comment les données sont interconnectées aide à construire des requêtes plus efficaces et à éviter les erreurs ou les résultats inattendus.

Familiarité avec le schéma : Familiarisez-vous régulièrement avec le schéma de la base de données.Cette familiarité aide à reconnaître les colonnes à regrouper et celles qui peuvent être utilisées efficacement dans les fonctions d'agrégation.

Application stratégique : appliquez de manière réfléchie les fonctions d'agrégation (telles que `SUM()`, `AVG()`, `COUNT()`, etc.) pour atteindre des objectifs analytiques spécifiques.Ces fonctions sont des outils puissants pour résumer et analyser les données, mais lorsqu’elles sont utilisées de manière inappropriée, elles peuvent conduire à des résultats trompeurs.

Évitez la sur-agrégation : veillez à ne pas abuser des fonctions d'agrégation sur de grands ensembles de données sans regroupement approprié, car cela peut entraîner des problèmes de performances et potentiellement obscurcir les informations que vous essayez d'extraire des données.

Garantissez les résultats attendus : après avoir apporté des ajustements à vos requêtes, comme la désactivation de `ONLY_FULL_GROUP_BY` ou la modification de la structure de vos requêtes, il est impératif de tester ces modifications de manière approfondie.Ces tests garantissent que les requêtes renvoient les résultats attendus et que l'intégrité des données est maintenue.

Évaluation des performances : les tests ne concernent pas seulement l'exactitude ;c'est aussi une question de performance. Évaluez l'impact de vos requêtes sur les performances de la base de données, en particulier lorsque vous travaillez avec des ensembles de données volumineux ou des agrégations complexes.

Pensées finales

Nous avons expliqué comment corriger le code d'erreur MySQL 1055, en nous concentrant sur l'adaptation des requêtes pour se conformer à « ONLY_FULL_GROUP_BY » ou, en dernier recours, en désactivant ce mode. Nous avons mis en évidence les meilleures pratiques pour garantir l'intégrité des données et l'exactitude des requêtes, en soulignant l'importance de comprendre et de travailler selon les normes SQL pour éviter les problèmes et garantir des opérations de base de données fiables.

Accélérez la création de votre site Web WordPress avec l'IA

Créez un site Web WordPress personnalisé adapté aux besoins de votre entreprise 10 fois plus rapidement avec 10Web AI Website Builder.

Générez votre site Web
Pas de carte de crédit nécessaire