PostgreSQL:行到列的变体

时间:2017-03-19 10:17:38

标签: postgresql

postgresql V 9.3

最好用一个例子解释:

所以我有两张桌子:

书籍表:

book_id   name
1         Aragorn
2         Harry Potter
3         The Great Gatsby
4         Book name, with a comma

用户ID到图书ID表:

user_id    book_id
31         1
31         2
32         3
34         1
34         4

我想向每位用户展示他/她的书籍,如下所示:

user_id   book_names
31        Aragorn,Harry Potter
32        The Great Gatsby
34        Aragorn,Book name, with a comma

基本上每个用户都会将他/她的图书用逗号分隔

如何以高效的方式实现这一目标?

1 个答案:

答案 0 :(得分:1)

如果您使用的是Postgres版本8.4或更高版本,则可以使用\b。一种选择是通过array_agg()汇总用户帐簿表,然后使用user_id为每个用户生成CSV列表。

array_agg()

在Postgres 9.0及更高版本中,您可以使用以下内容将书名聚合为CSV列表:

SELECT t1.user_id,
       array_to_string(array_agg(t2.name), ',') AS book_names
FROM user_books t1
INNER JOIN books t2
    ON t1.book_id = t2.book_id
GROUP BY t1.user_id