Maison >base de données >tutoriel mysql >Pourquoi ma requête MySQL GROUP BY génère-t-elle une erreur « only_full_group_by » ?

Pourquoi ma requête MySQL GROUP BY génère-t-elle une erreur « only_full_group_by » ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-29 13:44:10189parcourir

Why Does My MySQL GROUP BY Query Produce a

Comprendre le problème d'optimisation SELECT

Dans MySQL, lors de l'utilisation de la clause GROUP BY, il est obligatoire d'inclure toutes les colonnes non agrégées dans le Liste SELECT qui ne dépend pas fonctionnellement des colonnes groupées. Ceci est appliqué par le paramètre sql_mode=only_full_group_by.

Lorsque la requête :

SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
      `status` = 'Active'
GROUP BY `proof_type`

est exécutée, elle viole cette règle car la colonne id n'est pas incluse dans la clause GROUP BY. Cela conduit à l'erreur :

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'returntr_prod.tbl_customer_pod_uploads.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Options de solution

Pour résoudre ce problème, il existe plusieurs options :

1. Désactivez le mode only_full_group_by :

Cela peut être fait à l'aide de la commande suivante :

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

Cependant, cela n'est pas recommandé car cela peut conduire à des résultats inexacts.

2. Inclure toutes les colonnes dans la clause GROUP BY :

Cette option garantit la conformité avec le mode only_full_group_by en incluant explicitement toutes les colonnes non agrégées dans la clause GROUP BY :

SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
      `status` = 'Active'
GROUP BY `proof_type`, `id`

3. Utiliser des fonctions d'agrégation :

Plutôt que de sélectionner des colonnes spécifiques, la requête peut utiliser des fonctions d'agrégation pour extraire les données des lignes regroupées, résolvant ainsi le problème tout en respectant les meilleures pratiques :

SELECT `proof_type`, COUNT(*) AS `row_count`
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
      `status` = 'Active'
GROUP BY `proof_type`

Cette approche évite de récupérer des données inutiles et optimise les performances.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn