Maison >base de données >tutoriel mysql >Comment éviter les conflits de noms dans les clauses SQL GROUP BY et ORDER BY ?
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 :
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>
<code class="language-sql">... GROUP BY 1, 2, 3 ...</code>
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!