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

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

Barbara Streisand
Barbara Streisandoriginal
2025-01-10 14:51:43577parcourir

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

Conseils pour éviter les conflits de noms dans les clauses SQL GROUP BY et ORDER BY

Dans les requêtes SQL impliquant la combinaison et le tri de plusieurs colonnes, les noms de colonnes utilisés dans les clauses GROUP BY et ORDER BY doivent être soigneusement pris en compte car il peut y avoir des différences de nom entre les noms de colonnes de sortie et les noms de colonnes source dans le conflit du langage SQL.

Par exemple, le but d'une requête est de regrouper les données par modèle matériel (nom), type de tentative (type) et résultat binaire (résultat simplifié à 0 ou 1). Cependant, le résultat souhaité est d'afficher une seule ligne pour chaque modèle avec une combinaison unique de type et de cas.

Le problème vient de l'utilisation du nom de la colonne source GROUP BY dans les expressions CASE et result. Le standard SQL indique que dans ce cas, GROUP BY interprète result comme nom de colonne source et ORDER BY comme nom de colonne de sortie.

Afin de résoudre ce conflit et d'obtenir le résultat attendu, il existe plusieurs manières :

  1. Utiliser l'alias de colonne  : ajoutez un alias à l'expression CASE, en vous assurant qu'elle est différente de tout nom de colonne source. Par exemple :
<code class="language-sql">...
CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1
...
GROUP BY model.name, attempt.type, result1
...</code>
  1. Utiliser la référence de position : utilisez un nombre pour référencer explicitement la position d'une colonne dans la liste SELECT. Par exemple :
<code class="language-sql">...
GROUP BY 1, 2, 3
...</code>
  1. contient des constantes  : Bien que les colonnes constantes (par exemple, jour) n'aient pas besoin d'être incluses dans GROUP BY, par souci de clarté, elles peuvent être ajoutées sans affecter les résultats.

Voici la requête modifiée utilisant les références de localisation :

<code class="language-sql">SELECT model.name
     , attempt.type
     , CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result
     , CURRENT_DATE - 1 AS day
     , count(*) AS ct
FROM   attempt
JOIN   prod_hw_id USING (hard_id)
JOIN   model      USING (model_id)
WHERE  ts >= '2013-11-06 00:00:00'  
AND    ts <  '2013-11-07 00:00:00'
GROUP  BY 1, 2, 3
ORDER  BY 1, 2, 3;</code>

En garantissant des noms de colonnes corrects et en utilisant des références de position, les requêtes agrègent désormais les données comme prévu, fournissant une seule ligne de résultats pour chaque combinaison unique de modèle, de type et de résultat.

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!

Déclaration:
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