-
GROUP_CONCAT()を使用すると、通常、group-byロジックが呼び出され、一時テーブルが作成されます。これは通常、パフォーマンスに大きな悪影響を及ぼします。場合によっては、適切なインデックスを追加して、group-byクエリで一時テーブルを回避できますが、すべての場合に当てはまるわけではありません。
-
@MarcBが指摘しているように、グループ連結文字列のデフォルトの長さ制限はかなり短く、多くの人が切り捨てられたリストに混乱しています。 group_concat_max_len を使用して、制限を増やすことができます。 a> 。
-
PHPで文字列を配列に分解することは、無料ではありません。 PHPで1回の関数呼び出しでそれを実行できるからといって、それがパフォーマンスに最適であるとは限りません。違いのベンチマークはしていませんが、どちらかがあるとは思えません。
-
GROUP_CONCAT()はMySQLismです。他のSQL製品では広くサポートされていません。場合によっては(SQLiteなど)、GROUP_CONCAT()関数がありますが、MySQLとまったく同じようには機能しないため、複数のRDBMSバックエンドをサポートする必要がある場合、混乱を招くバグが発生する可能性があります。もちろん、移植について心配する必要がなければ、これは問題ではありません。
-
currencies
から複数の列を取得する場合 テーブルの場合、複数のGROUP_CONCAT()式が必要です。リストは同じ順序であることが保証されていますか?つまり、あるリストの3番目のフィールドは、次のリストの3番目のフィールドに対応していますか?答えはノーです。ORDER BY
で注文を指定しない限りそうではありません。 GROUP_CONCAT()内の句。
私は通常、最初のコード形式を好み、従来の結果セットを使用し、結果をループして、クライアントIDでインデックス付けされた新しい配列に保存し、通貨を配列に追加します。これは単純なソリューションであり、SQLをシンプルかつ最適化するのが容易であり、フェッチする列が複数ある場合にうまく機能します。
GROUP_CONCAT()が悪いと言っているのではありません!多くの場合、これは本当に便利です。ただし、機能や言語機能を使用する(または回避する)ために、万能のルールを作成しようとするのは単純です。