【问题标题】:sql - GROUP_CONCAT in PostgreSQL 9.6sql - PostgreSQL 9.6 中的 GROUP_CONCAT
【发布时间】:2020-01-23 11:29:24
【问题描述】:

我有一张表,我想为每个 id 拉一行,并连接字段值。

例如,在我的表中,我有这个:

SELECT objects.id, objects.title, categories.name,
       (SELECT COUNT(0) FROM comments WHERE comments.object_id = objects.id) as count
FROM objects 
LEFT JOIN restaurant_properties ON restaurant_properties.object_id = objects.id
LEFT JOIN categories on categories.id = restaurant_properties.category_id
WHERE type_id = 2 


id | title      | category_name | count |

12 | Tosca      | Cafe          | 0     |
12 | Tosca      | Bar           | 0     |
12 | Tosca      | Pizza         | 0     |
11 | Green Cafe | Cafe          | 0     |
11 | Green Cafe | Tea House     | 0     |

我想输出:

id | title      | category_name    | count |

12 | Tosca      | Cafe, Bar, Pizza | 0     |
11 | Green Cafe | Cafe, Tea House  | 0     |

当我使用 GROUP BY "name" 时,它给了我一个错误:

[Err] 错误:“objects.id”列必须出现在 GROUP BY 子句中或在聚合函数中使用

【问题讨论】:

  • 您想要 MySQL 或 Postgres 的解决方案吗?
  • 您通常 GROUP BY 与您 SELECT 相同的列,但作为聚合函数参数的列除外。

标签: mysql sql postgresql


【解决方案1】:

聚合查询应该可以工作,STRING_AGG():

SELECT o.id, o.title, STRING_AGG(c.name, ', ') as categories,
       (SELECT COUNT(*) FROM comments co WHERE co.object_id = o.id) as count
FROM objects o LEFT JOIN 
     restaurant_properties rp
     ON rp.object_id = o.id LEFT JOIN
     categories c
     ON c.id = rp.category_id
WHERE type_id = 2 
GROUP BY o.id, o.title

【讨论】:

  • 精确解决方案。很好!!
猜你喜欢
  • 2021-07-29
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多