Maison >base de données >tutoriel mysql >Comment résoudre les conflits de noms dans les clauses SQL GROUP BY et ORDER BY ?
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>
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>
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>
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!