3NF mysql テーブルの複数の行の内容を結合する
-
20-09-2019 - |
質問
すべてのデータを忠実に正規化したのですが、出力用に 3NF 行を 1 行に結合するときに問題が発生しました。これまではサーバーサイドのコーディングでこれを行ってきましたが、さまざまな理由から、別の行に関連するすべての行を選択し、それらをすべて MySQL で 1 つの行に結合する必要があります。
それで説明してみると、次のようになります。
テーブルが 3 つあります。
- カテゴリー
- 記事
- カテゴリ記事_3NF
カテゴリには以下が含まれます カテゴリID + タイトル、説明などArticles テーブルには、任意の数の記事を含めることができます。 記事ID + コンテンツを格納するテキスト フィールド。の カテゴリー記事 テーブルは 2 つをリンクするために使用されるため、両方の カテゴリID そしてその 記事ID.
ここで、Category レコードを選択し、リンクする categoryArticles_3NF テーブルを介して Articles テーブルに JOIN すると、結果はそのカテゴリに含まれる記事ごとに個別の行になります。問題は、カテゴリごとにコンテンツを含む 1 行を出力したいことです。 全て 内の記事。
それがばかげた要求のように聞こえるかもしれませんが、それは実際にそうなのです。私は問題を説明する良い方法として記事を使っているだけです。私のデータは実際には多少異なります。
とにかく、これを達成する唯一の方法は、「」を使用することです。グループコンキャット' ステートメントを使用してコンテンツ フィールドをグループ化します。これの問題は、返されるデータ量に制限があることであり、より多くのデータを処理できるようにする必要があります。
誰かこれを行う方法を教えてもらえますか?
ありがとう。
解決
これは、詳細な情報がなければ、フロントエンドで実行する必要があるように思えます。
必要に応じて、システム変数を設定することで GROUP_CONCAT のサイズ制限を増やすことができます。 group_concat_max_len. 。それに基づく制限があります max_allowed_packet, を増やすこともできます。パケットの最大サイズは1GBだと思います。それを超える必要がある場合は、設計に重大な欠陥があることになります。
編集:これがコメントに埋もれるだけでなく、回答に含まれるように...
変更したくない場合は、 group_concat_max_len グローバルに変更できる場合は、次のようにセッションのみ変更できます。
SET SESSION group_concat_max_len = <your value here>