Maison > base de données > tutoriel mysql > Comment résoudre les conflits de noms dans les clauses SQL GROUP BY et ORDER BY ?

Comment résoudre les conflits de noms dans les clauses SQL GROUP BY et ORDER BY ?

Patricia Arquette
Libérer: 2025-01-10 14:59:44
original
227 Les gens l'ont consulté

How to Resolve Naming Conflicts in SQL GROUP BY and ORDER BY Clauses?

SQL GROUP BY et ORDER BY Conflits de noms de clauses : une solution

La requête d'origine rencontre des problèmes lors du regroupement des données par modèle matériel, type de résultat et cas en raison de conflits de noms entre la colonne d'expression CASE calculée et la colonne source (attempt.result). Cela conduit à plusieurs lignes pour des combinaisons de types et de cas identiques.

La solution consiste à éviter l'utilisation directe du nom de la colonne source dans la clause GROUP BY. Voici deux approches efficaces :

Méthode 1 : Regrouper directement par l'expression CASE :

Au lieu de regrouper par attempt.result, regroupez par l'expression CASE elle-même :

<code class="language-sql">GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END</code>
Copier après la connexion

Cela regroupe directement les données en fonction du résultat calculé de l'instruction CASE, éliminant ainsi toute ambiguïté.

Méthode 2 : Utiliser des alias de colonne :

Attribuez un alias à la colonne de sortie de l'expression CASE :

<code class="language-sql">SELECT ..., CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1
GROUP BY model.name, attempt.type, result1</code>
Copier après la connexion

L'alias result1 distingue clairement la colonne calculée de la colonne source, résolvant ainsi le conflit. Notez que ORDER BY donnera la priorité au nom de colonne alias (result1) dans ce cas.

Bonne pratique : références de position

Pour éviter complètement les conflits de noms, utilisez des références de position dans les clauses GROUP BY et ORDER BY. Cette approche est moins sujette aux erreurs et améliore la lisibilité des requêtes, notamment dans les requêtes complexes. L'exemple ci-dessous illustre cette technique au sein d'une requête simplifiée et réécrite :

<code class="language-sql">SELECT m.name, a.type, CASE WHEN a.result = 0 THEN 0 ELSE 1 END AS result, CURRENT_DATE - 1 AS day, count(*) AS ct
FROM attempt a
JOIN prod_hw_id p USING (hard_id)
JOIN model m USING (model_id)
WHERE ts >= '2013-11-06 00:00:00' AND ts < CURRENT_DATE  --Corrected the incomplete WHERE clause
GROUP BY 1, 2, 3  -- Positional references for model.name, a.type, result
ORDER BY 1, 2, 3  -- Positional references for model.name, a.type, result</code>
Copier après la connexion

Cette requête révisée est plus concise et évite les conflits de noms potentiels. N'oubliez pas de toujours vérifier que votre clause WHERE est complète. L'original était incomplet et corrigé ci-dessus.

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