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

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

Patricia Arquette
Libérer: 2025-01-10 14:46:42
original
232 Les gens l'ont consulté

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

Noms de colonnes dans les clauses SQL GROUP BY et ORDER BY

Question :

Lors du regroupement de données en SQL, vous devez spécifier les noms de colonnes corrects dans les clauses GROUP BY et ORDER BY. S'il existe un conflit de nom entre les colonnes d'entrée et de sortie, les résultats peuvent être incorrects.

Solution :

GROUP BYClause

  • Évitez d'utiliser des noms de colonnes source : N'utilisez pas de noms de colonnes sources (par exemple attempt.result) directement pour le regroupement. Le regroupement doit être effectué à l'aide d'une expression CASE qui détermine le résultat souhaité. Cela garantit que vous regroupez selon les valeurs correctes.

    <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
  • Utiliser les alias de colonnes : Si vous préférez utiliser les noms de colonnes d'origine, fournissez un alias différent dans la liste SELECT. Cela empêche les colonnes de sortie d'interférer avec le regroupement.

    <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

ORDER BYClause

  • Utilisez des références de position : Au lieu de citer directement les noms des colonnes de sortie, utilisez des références de position (nombres ordinaux) dans la clause ORDER BY. Cela évite tout conflit de nom potentiel.

    <code class="language-sql">  ORDER BY 1, 2, 3</code>
    Copier après la connexion

Exemple :

Réécrivez la requête en utilisant la syntaxe JOIN correcte, les références de position et en résolvant les conflits de noms :

<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 <  '2013-11-07 00:00:00'
GROUP  BY 1, 2, 3
ORDER  BY 1, 2, 3;</code>
Copier après la connexion

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