0

我的 django 应用程序的 postgres 数据库中有以下三个表:

publication {
    id
    title
}

tag {
    id
    title
}

publication_tags{
    id
    publication_id
    tag_id
}

其中标签和发布具有多对多关系。

我想制作一个包含三列的临时表:1)出版物标题,2)出版物ID和3)标签,其中标签是给定所有标签的列表(如果可能,以字符串的形式)出版物。

到目前为止,我已经制作了临时表并用出版物 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

您可能想调整分隔符,我猜逗号会有意义。

我建议您使用 TEXT 而不是 VARCHAR ,pub_tags这样您就不必担心字符串聚合溢出pub_tags长度。实际上,我建议使用 TEXT 而不是 VARCHAR 句点:除了浪费时间检查 VARCHAR 的长度外,PostgreSQL 会将它们视为相同的,因此 VARCHAR 是毫无意义的,除非您特别需要有限的长度。

另外,如果您不需要特别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 回答