SQL 数组聚合和连接

标签 sql postgresql join knex.js array-agg

在我的 Postgres 数据库中,我有 3 个表。一个用于users,一个用于comments,一个用于映射这两个user_comment_map。表格如下所示:

users
| id | name | age |
|----|------|-----|
| 1  | user | 20  |


comments
| id | mood  | subject | content         | created_at               |
|----|-------|---------|-----------------|--------------------------|
| 1  | happy | funny   | here is content | Tue Sep 27 2016 13:44:19 |
| 2  | silly | cool    | more content    | Tue Sep 27 2016 14:44:19 |

user_comment_map
| id | user_id | comment_id |
|----|---------|------------|
| 1  |        1|           1|
| 2  |        1|           2|

我正在尝试编写一个导致以下对象的 SQL 查询:

[{
  id: 1,
  name: "user",
  age: 20,
  comments: [
    {
      id: 1,
      mood: "happy",
      subject: "silly",
      content: "here is content",
      created_at: "Tue Sep 27 2016 13:44:19"
    }, 
    {
      id: 2,
      mood: "silly",
      subject: "cool",
      content: "more content",
      created_at: "Tue Sep 27 2016 14:44:19"
    },
  },
  {...}
]

我尝试使用 joinsarray_agg 但我无法获取该格式的数据。任何帮助将非常感激。注意:我也在使用 knex 来构建查询,但我认为 knex 不能在不求助于 knex.raw

的情况下处理这样的事情

最佳答案

应该这样做:

SELECT
    json_build_object(
        'id',id,
        'name',name,
        'comments',(
            SELECT json_agg(json_build_object(
                'id', comments.id,
                'mood', comments.mood,
                'subject', comments.subject,
                'content', comments.content,
                'created_at', comments.created_at
            ))
            FROM user_comment_map JOIN comments ON comment_id=comments.id
            WHERE user_id=users.id
        )
    )
FROM users
WHERE id=1;

关于SQL 数组聚合和连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39734452/

相关文章:

postgresql - 如何在 Odoo 8 中创建 One2one 关系?

mysql - MySQL 语句的不同格式/效率

sql - Postgresql,从列中插入值

java - Spring 数据库初始化仅在应用程序重启后才有效

php - MySQL一行中的几个ID与另一张表连接

mysql - 是否可以使用mysql脚本获取列表对象的数据?

mysql - 错误代码 1248,SQL 状态 42000 : Every derived table must have its own alias

where 子句中的 SQL Case 和 LIKE

sql - 提取特定空间实例之间的字符串 - SQL Server

sql - 我可以在 SQL Server/TSQL 中回滚动态 SQL