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
Patricia Arquetteoriginal
2025-01-10 14:46:42233parcourir

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>
  • 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>

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>

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>

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