ホームページ > データベース > mysql チュートリアル > SQL の GROUP BY 句と ORDER BY 句での名前の競合を回避するにはどうすればよいですか?

SQL の GROUP BY 句と ORDER BY 句での名前の競合を回避するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-10 14:46:42
オリジナル
232 人が閲覧しました

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

SQL GROUP BY および ORDER BY 句の列名

質問:

SQL でデータをグループ化する場合、GROUP BY 句と ORDER BY 句に正しい列名を指定する必要があります。入力列と出力列の間に名前の競合がある場合、結果が不正確になる可能性があります。

解決策:

GROUP BY 条項

  • ソース列名の使用を避ける: グループ化にソース列名 (例: attempt.result) を直接使用しないでください。グループ化は、目的の結果を決定する CASE 式を使用して行う必要があります。これにより、正しい値でグループ化することができます。

    <code class="language-sql">  GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END</code>
    ログイン後にコピー
  • 列の別名を使用する: 元の列名を使用したい場合は、SELECT リストに別の別名を指定します。これにより、出力列がグループ化に干渉するのを防ぎます。

    <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 条項

  • 位置参照を使用する: 出力列名を直接引用する代わりに、ORDER BY 句で位置参照 (序数) を使用します。これにより、潜在的な名前の競合が回避されます。

    <code class="language-sql">  ORDER BY 1, 2, 3</code>
    ログイン後にコピー

例:

正しい JOIN 構文、位置参照を使用してクエリを書き直し、名前の競合を解決します。

<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>
ログイン後にコピー

以上がSQL の GROUP BY 句と ORDER BY 句での名前の競合を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート