3

history次の列のテーブルがあります。

row_id, msgid, sender, receiver, chatcontent, transdate, transtime

各チャットのトランスクリプトは、テーブルの個別の行として保存されます。

シナリオ:コンテンツが2048文字を超える場合、私のフレームワークはチャットコンテンツを複数のトランスクリプトに分割します。データは、msgid、sender、receiver、transdate、transtimeなどの同じ詳細を持つ複数の行に格納されます。 。

たとえば、私のテーブルの内容は

001, msgid1, mark@test.int, james@test.int, this is a long tes, 2013-03-13, 13:55:34
002, msgid1, mark@test.int, james@test.int, t message which is, 2013-03-13, 13:55:34
003, msgid1, mark@test.int, james@test.int,  splitted in multi, 2013-03-13, 13:55:34
004, msgid1, mark@test.int, james@test.int, ple rows, 2013-03-13, 13:55:34
005, msgid2, james@test.int, mark@test.int, yup i got you, 2013-03-13, 13:56:12

今、私は単一のクエリでデータをフェッチしたいと思います。

msgid1, mark@test.int, james@test.int, this is a long test message which is splitted in multiple rows, 2013-03-13, 13:55:34
msgid2, james@test.int, mark@test.int, yup i got you, 2013-03-13, 13:56:12

どうやってするの。1つのクエリですべての詳細を取得できません。コマンドを使用してチャットコンテンツを1つの列にマージすることはできますが、msgidの値をハードコーディングしたくありません

SELECT array_to_string(array(SELECT chatcontent FROM history where msgid='msgid1'),'');
4

1 に答える 1

9
SELECT
    msgid,
    sender,
    receiver,
    transdate,
    transtime,
    array_to_string(array(
        select chatcontent
        from history
        where msgid = h.msgid
        order by row_id
        ), ' '
    ) chatcontent
from history h
group by 1, 2, 3, 4, 5, 6
order by 1
于 2013-03-14T12:45:03.390 に答える