【问题标题】:Format nested JSON object from Postgres query从 Postgres 查询中格式化嵌套的 JSON 对象
【发布时间】:2016-12-01 05:19:53
【问题描述】:

我想得到一个格式类似这样的 JSON 对象:

{
  "username": "USERNAME",
  "teamname": "TEAMNAME",
  "logs": [
    {
      "log": {
        "log_id": 29,
        "person_id": 3,
        "activity_id": 3,
        "shoe_id": null,
        "logdate": "2016-11-29",
        "distance": null,
        "activitytime": null,
        "sleep": null,
        "heartrate": null,
        "logtitle": null,
        "description": null
      },
      "activity": "Swim", 
      "comments": {
        "comment_id": 1, 
        "description": "This is a comment", 
        "person_id": 1,
        "log_id": 29
       }
   }]
}

目前,除了 cmets 之外,我的所有内容都已正确格式化。这是我正在使用的 SQL 查询:

SELECT p.username, t.teamname, json_agg(json_build_object('log', l.*, 'comments', c.*, 'activity', a.activity)) as logs
        FROM person_tbl p 
        INNER JOIN log_tbl l ON p.person_id = l.person_id 
        INNER JOIN activity_tbl a ON l.activity_id = a.activity_id 
        INNER JOIN comment_tbl c ON c.log_id = l.log_id
        INNER JOIN person_team_tbl pt ON p.person_id = pt.person_id 
        INNER JOIN team_tbl t on t.team_id = pt.team_id 
        WHERE t.team_id = 5
        AND l.logdate > NOW()::date - 7 
        GROUP BY p.username, t.teamname 
        ORDER BY p.username

我无法获取每个日志的 cmets。现在,它正在返回每条评论并重复日志(它们没有关联)。

另外,当其他所有内容为空时(例如上周没有日志时),我如何让此查询返回 usernameteamname

【问题讨论】:

  • NULL 战斗,其余部分使用COALESCE(first_not_null,first_not_null),最好在沙箱中的某个地方构建代码,比如sqlfiddle

标签: sql json postgresql query-optimization


【解决方案1】:

如果没有 SQLfiddle,我们不知道您的数据(和结构)是什么,因此很难回答您的问题。 对于 NULL 情况 - 请像这样修改 WHERE 子句(故意不使用 COALESCE)

WHERE t.team_id = 5 AND (l.logdate IS NULL OR l.logdate > NOW()::date - INTERVAL '7 day')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多