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
Libérer: 2024-12-29 13:44:10
original
197 Les gens l'ont consulté

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`
Copier après la connexion

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
Copier après la connexion

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',''));
Copier après la connexion

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`
Copier après la connexion

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`
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal