0

ここで、私がやりたいことを簡単に説明する必要があります。

「コンテナ」(送付状) のテーブルと、各コンテナ内の「アイテム」(ドキュメント) の別のテーブルがあります。

各行の最後に列があり、コンテナー内のアイテムのコンマスペースのリストがあるすべてのコンテナーをリストするテーブルを出力したいと考えています。目的は、(datatables プラグインを使用して) 各コンテナー内の項目の単純な検索を実装することです。

もちろん、コンテナー テーブルにクエリを実行し、"PHP while ループ" 中に、アイテム テーブル内の一致するコンテナー ID をセカンダリ クエリすることができます。次に、各行のアイテムを連結しますが、複数の SQL 呼び出しを避けたいと考えています。

そこで、右結合を作成しました(以下に簡略化したバージョンを書きます)...

SELECT transmittal.*, transmittal_documents.*
FROM transmittal RIGHT JOIN
     transmittal_documents
     ON transmittal_documents.transmittal_id = transmittal.transmittal_id

PHP join などを使用して「アイテム」を連結しながら、テーブル内の一意の「コンテナー」値のみを収集するように PHP の while ループをコーディングする最良の方法は何ですか。

または、PHP で処理する前に SQL でこれを行うことができますか?

よろしくお願いいたします。

4

2 に答える 2

1

最良の方法は、次を使用して SQL でこれを行うことですgroup_concat

SELECT t.*, group_concat(td.item) as items
FROM transmittal t LEFT JOIN
     transmittal_documents td
     ON td.transmittal_id = t.transmittal_id
GROUP BY td.transmittal_id;

left joinではなく、という意味だと思いますright join。は、他のテーブル内のすべての一致とともに、テーブル内のleft joinすべてを保持します。transmittal

于 2014-01-14T13:00:30.197 に答える
0

ゴードン・リノフからの上記の回答のおかげで、私はこれをうまく機能させることができました...

t を選択します。、td。, group_concat(td.item) を項目として FROM transmittal t LEFT JOIN transmittal_documents td ON td.transmittal_id = t.transmittal_id GROUP BY t.transmittal_id

追加の GROUP BY が必要な理由はわかりませんが、うまくいきました。それがなければ、1行のデータしか受け取りませんでした。

実際には追加のテーブルでドキュメント情報を結合する必要がありましたが、「td.item」値が文字列の場合は問題になりません (ここにあるテーブルの INT であり、BLOB が作成されました)。正しい情報が含まれていませんでした)。

追加のパラメーター設定を使用しないと GROUP_CONCAT フィールドに制限があるように見えるので、PHP の配列でこれを処理する方が良いかもしれません。

于 2014-01-14T14:53:51.170 に答える