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 BY
ClauseÉ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 BY
ClauseUtilisez 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!