Maison >base de données >tutoriel mysql >Erreur MySQL ONLY_FULL_GROUP_BY : correctifs faciles et meilleures pratiques
Vous rencontrez l'erreur MySQL ONLY_FULL_GROUP_BY
? Ce guide fournit des explications claires et des solutions pratiques pour les utilisateurs MySQL novices et expérimentés.
ONLY_FULL_GROUP_BY
ONLY_FULL_GROUP_BY
est un paramètre MySQL appliquant le comportement GROUP BY
standard. Lorsque ce paramètre est activé, vos SELECT
relevés doivent respecter ces règles :
SELECT
doivent être dans GROUP BY
: Chaque colonne sélectionnée doit également être incluse dans la clause GROUP BY
.GROUP BY
nécessitent des fonctions d'agrégation (par exemple, COUNT
, SUM
, AVG
, MAX
, MIN
).GROUP BY
.Considérons une table nommée orders
:
<code class="language-sql">CREATE TABLE orders ( id INT, customer_name VARCHAR(100), product VARCHAR(100), amount DECIMAL(10,2) ); INSERT INTO orders VALUES (1, 'John', 'Laptop', 1000), (2, 'John', 'Mouse', 20), (3, 'Mary', 'Keyboard', 50), (4, 'Mary', 'Monitor', 200);</code>
Cette requête déclenchera l'erreur :
<code class="language-sql">SELECT customer_name, product, SUM(amount) FROM orders GROUP BY customer_name;</code>
Le problème ? product
est sélectionné mais pas regroupé. MySQL ne peut pas déterminer quel produit afficher pour chaque client (car il peut avoir acheté plusieurs articles).
Solution 1 : Modifier les paramètres MySQL
Une solution rapide (au niveau de la session) :
<code class="language-sql">SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));</code>
Un correctif permanent (au niveau mondial) :
<code class="language-sql">SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';</code>
Solution 2 : Ajustez vos requêtes
GROUP BY
:<code class="language-sql">SELECT customer_name, product, SUM(amount) FROM orders GROUP BY customer_name, product;</code>
MAX
, MIN
) :<code class="language-sql">SELECT customer_name, MAX(product) as product, SUM(amount) as total_amount FROM orders GROUP BY customer_name;</code>
<code class="language-sql">SELECT o.* FROM orders o INNER JOIN ( SELECT customer_name, SUM(amount) as total_amount FROM orders GROUP BY customer_name ) grouped ON o.customer_name = grouped.customer_name;</code>
<code class="language-sql">SELECT category, MAX(product_name) as top_product, COUNT(*) as total_orders, SUM(amount) as total_sales FROM sales GROUP BY category;</code>
<code class="language-sql">SELECT customer_id, MIN(first_name) as first_name, MIN(last_name) as last_name, COUNT(*) as total_purchases, SUM(purchase_amount) as total_spent, AVG(purchase_amount) as avg_purchase_amount FROM customer_purchases GROUP BY customer_id;</code>
Identifiants uniques manquants : Incorrect : SELECT id, customer_name, COUNT(*) FROM orders GROUP BY customer_name;
Correct : SELECT MIN(id) as first_order_id, customer_name, COUNT(*) FROM orders GROUP BY customer_name;
Jointures complexes : Considérez attentivement l'agrégation lorsque vous utilisez des jointures avec GROUP BY
. Utilisez les fonctions d'agrégation de manière appropriée ou refactorisez votre requête à l'aide de sous-requêtes.
ONLY_FULL_GROUP_BY
pour améliorer la précision des requêtes et le respect des normes SQL.SELECT @@sql_mode;
SHOW VARIABLES LIKE 'sql_mode';
SHOW GRANTS;
ONLY_FULL_GROUP_BY
activéBien que le désactiver soit tentant, pensez à garder ONLY_FULL_GROUP_BY
actif pour les nouveaux projets, le respect des normes SQL et pour éviter les erreurs de requête subtiles.
L'erreur ONLY_FULL_GROUP_BY
, bien que frustrante au départ, encourage une meilleure conception des requêtes. Comprendre son objectif et mettre en œuvre les solutions appropriées améliorera vos compétences MySQL et la maintenabilité du code. Donnez la priorité à une sélection de données précise et à des fonctions d’agrégation appropriées. Bon codage !
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!