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 » ?
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!