使用 json 格式的 array_agg 检索一对多关系行 - postgresql

Sai*_*h A 3 sql postgresql node-postgres

我有两个表,分别为:1. 采访 2. 问题

每个面试表还可以多出一个问题。

我想以这样的方式检索数据:在一行中,面试详细信息以及所有问题及其详细信息在单列中呈现,并以数组格式与该特定面试相关联。

我已经尝试了 array_agg()、json_object_build() 的所有方法,但似乎无法使其正常工作。

模式: 表模式图像

SQL 查询我现在有:

SELECT
         i.id as interview_id, i.board, i.time_taken, i.notes, i.interview_date, 
         u.id as user_id, u.first_name, u.last_name, u.state, u.district, u.optional, 
         j.name as job, 
         json_build_object('question', q.question, 'answer', q.answer, 'member', q."member", 'order', q."order") as questions
         FROM interview i
         LEFT JOIN question q ON q.interview_id = i.id 
         INNER JOIN users u ON i.user_id = u.id 
         INNER JOIN user_jobs uj ON uj.user_id = u.id 
         INNER JOIN job j ON uj.job_id = j.id
         GROUP BY u.id, i.id, j.name, q.question, q.answer, q.order, q."member";
Run Code Online (Sandbox Code Playgroud)

我得到的结果:

interview_id | time | ... | questions
1001         | 25   | ... | {"question": "How are you", "answer": "I'm good", ...}
1001         | 25   | ... | {"question": "What's your name", "answer": "My name is..", ...}
1002         | 40   | ... | {"question": "Who are you", "answer": "I'm nobody", ...}
1002         | 40   | ... | {"question": "Are you a robot", "answer": "No, I'm not", ...}
Run Code Online (Sandbox Code Playgroud)

我想合并具有相同 Interview_id 的行并将问题合并到 json 对象数组中。在 json_build_object() 周围使用 array_agg() 也没有用。

我想要的结果:

interview_id | time | ... | questions
1001         | 25   | ... | [{"question": "...", "answer": "...", ...}, {"question": "...", "answer": "...", ...}]
1002         | 40   | ... | [{"question": "...", "answer": "...", ...}, {"question": "...", "answer": "...", ...}]
Run Code Online (Sandbox Code Playgroud)

是否可以或者在检索面试 ID 后单独查询问题表更好?

数据库:PostgreSQL
环境:Node.js - Express(node-postgres 包)

非常感谢您的帮助。请询问是否需要更多详细信息。

Gor*_*off 7

您需要修复GROUP BY并使用JSON_AGG()

SELECT i.id as interview_id, i.board, i.time_taken, i.notes, i.interview_date, 
       u.id as user_id, u.first_name, u.last_name, u.state, u.district, u.optional, 
       j.name as job, 
       json_agg(json_build_object('question', q.question, 'answer', q.answer, 'member', q."member", 'order', q."order")) as questions
FROM interview i LEFT JOIN
     question q
     ON q.interview_id = i.id JOIN
     users u
     ON i.user_id = u.id JOIN
     user_jobs uj
     ON uj.user_id = u.id JOIN
     job j
     ON uj.job_id = j.id
GROUP BY u.id, i.id, j.name
Run Code Online (Sandbox Code Playgroud)