我有2个simlpe表,例如产品(ID,名称)和 product_countries_rel(id,country_id,product_id)。即每个产品可以有多个国家。
简单INNER JOIN
查询:
SELECT p.id, p.name, pcr.country_id FROM product p INNER JOIN product_countries_rel pcr ON p.id = pcr.product_id
。
会给出这个结果:
id | name | country_id
--------+-------------------------+-----------
1 | ProductName1 | 23
1 | ProductName1 | 25
2 | ProductName2 | 56
2 | ProductName2 | 57
但我希望获得一条product
countries
列的记录,其中包含逗号delimeted country_ids
。即我想要这个:
id | name | country_ids
--------+-------------------------+-----------
1 | ProductName1 | 23,25
2 | ProductName2 | 56,57
如何实现这一目标?如果它很重要 - 我正在使用PostgreSQL 9.3。
答案 0 :(得分:1)
在Postgresql 9+版本中,您可以使用string_agg
执行此操作:
SELECT p.id, p.name, string_agg(cast(pcr.country_id as varchar(5)), ',')
FROM product p INNER JOIN product_countries_rel pcr ON p.id = pcr.product_id
GROUP BY p.id, p.name
在旧版本中,使用array_agg
函数构建数组并使用array_to_string
将其作为分隔字符串,可以实现相同的结果:
SELECT p.id, p.name, array_to_string(array_agg(pcr.country_id), ',')
FROM product p INNER JOIN product_countries_rel pcr ON p.id = pcr.product_id
GROUP BY p.id, p.name