0

django アプリの postgres db に次の 3 つのテーブルがあります。

publication {
    id
    title
}

tag {
    id
    title
}

publication_tags{
    id
    publication_id
    tag_id
}

タグとパブリケーションには多対多の関係があります。

1) パブリケーション タイトル、2) パブリケーション ID、3) タグの 3 つの列を持つ一時テーブルを作成したいと思います。ここで、tags は、指定されたすべてのタグのリスト (可能であれば文字列の形式) です。出版。

これまでのところ、一時テーブルを作成し、パブリケーション ID とパブリケーション タイトルを入力しましたが、タグを取得する方法がわかりません。これは私がこれまでに持っているものです:

CREATE TEMP TABLE pubtags (pub_id INTEGER, pub_title VARCHAR(50), pub_tags VARCHAR(50))
INSERT INTO pubtags(pub_id, pub_title) SELECT id, title FROM apricot_app_publication

最後のステップをどのように進めるかについて誰かアドバイスしてもらえますか?

4

1 に答える 1

1

の仕事のようですねstring_agg:

string_agg(expression, delimiter)

区切り文字で区切られた文字列に連結された入力値

したがって、次のようなものがうまくいくはずです:

insert into pubtags (pub_id, pub_title, pub_tags)
select p.id, p.title, string_agg(t.title, ' ,')
from publication p
join publication_tags pt on (p.id = pt.publication_id)
join tag on (pt.tag_id = t.id)
group by p.id, p.title

区切り文字を調整したい場合があります。カンマが理にかなっていると思いました。

pub_tags文字列の集計が長さをオーバーフローすることを心配する必要がないように、 VARCHAR の代わりに TEXT を使用することをお勧めしますpub_tags。実際には、VARCHAR ピリオドの代わりに TEXT を使用することをお勧めします。

また、特に文字列にする必要がない場合はpub_tags、代わりに配列を使用できます。

CREATE TEMP TABLE pubtags (
    pub_id INTEGER,
    pub_title TEXT,
    pub_tags TEXT[]
)

array_agg代わりにstring_agg:

insert into pubtags (pub_id, pub_title, pub_tags)
select p.id, p.title, array_agg(t.title)
-- as above...

配列を使用すると、必要に応じてタグを簡単に展開できます。

于 2013-06-11T21:57:04.250 に答える