LEFT JOIN を使用した MySQL の GROUP_CONCAT 関数: データ集約のトラブルシューティング
SQL プログラミングのコンテキストでは、MySQL の GROUP_CONCAT のような集約関数が重要な役割を果たします。複数の値を単一の文字列に結合する場合。ただし、LEFT JOIN ステートメントを使用する場合には問題が発生し、予期しない結果が生じる可能性があります。この質問では、そのような問題について議論し、解決策を模索します。
問題を理解するために、提供されているヘルプ デスク データベースの例を参照してください。目標は、チケットのリストとそれに対応するソリューション エントリを取得することです。最初の SELECT ステートメントは、GROUP_CONCAT を利用して Solutions テーブルからのソリューション値を連結することによってこれを実行しようとします。しかし、結果は意図したとおりではありません。特定のソリューションを含むチケットごとに個別の行を受け取る代わりに、両方のチケットからのすべてのソリューションを含む 1 つの行だけが返されます。
問題は、プライマリ テーブルのすべての行を保持する LEFT JOIN 操作にあります ( Tickets) に含まれ、一致する値を持つ 2 次テーブル (Solutions) の行が含まれます。この場合、チケット 1 にはソリューション エントリが 2 つ、チケット 2 にはソリューション エントリが 2 つあるため、チケット 1 の行が 2 回繰り返され、すべてのソリューションが結合されます。
この問題を解決するには、次のソリューションが提供されます。ネストされた GROUP_CONCAT ステートメントと組み合わせてサブクエリを使用します。サブクエリは各チケットのソリューション値をグループ化し、チケットごとに単一の連結文字列を生成します。次に、この文字列は LEFT JOIN を使用してプライマリ テーブルと結合され、目的の出力が作成されます。
あるいは、別のソリューションでは、GROUP_CONCAT 関数内の相関サブクエリを利用します。このサブクエリは、各チケットの連結されたソリューション値を動的に取得し、正しいソリューションが対応するチケット エントリに関連付けられていることを確認します。
以上が予期しない集計を回避する方法: MySQL の GROUP_CONCAT と LEFT JOIN?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。