我對 SQL 很陌生,并且有兩個 Postgresql 表:
CREATE TABLE project (
id uuid DEFAULT uuid_generate_v4 (),
name VARCHAR(100) NOT NULL,
creator_id uuid NOT NULL
);
CREATE TABLE task (
id uuid DEFAULT uuid_generate_v4 (),
name VARCHAR(100) NOT NULL,
project_id uuid NOT NULL,
);
我正在運行一個非常簡單的連接:
SELECT project.*, task.name as task_name
FROM project
INNER JOIN task ON task.project_id = $1
WHERE project.id =
結果是:
[
{
id: '5936d843-aca0-4453-ad24-a7b3a6b90393',
name: 'Test project',
creator_id: '2e0e73af-e824-46a2-89ee-c08cf9c5de7a',
task_name: 'Test task'
},
{
id: '5936d843-aca0-4453-ad24-a7b3a6b90393',
name: 'Test project',
creator_id: '2e0e73af-e824-46a2-89ee-c08cf9c5de7a',
task_name: 'Test task 2'
}
]
我的問題是,是否可以合并 id 上的這些行以獲得更像這樣的結果:
[
{
id: '5936d843-aca0-4453-ad24-a7b3a6b90393',
name: 'Test project',
creator_id: '2e0e73af-e824-46a2-89ee-c08cf9c5de7a',
tasks: [
{
task_name: 'Test task'
},
{
task_name: 'Test task 2'
}
}
]
我知道有一些方法可以幫助我實作這一目標,例如使用 COALESCE、json_build_object 或 json_agg。但這讓我為看起來很簡單的東西構建“復雜”查詢,所以你知道是否有更簡單的方法來做到這一點,或者我應該只取第一個結果并用我選擇的語言(這里是javascript)處理它根據需要合并?
uj5u.com熱心網友回復:
您需要按專案分組并聚合專案任務。
SELECT p.*,
jsonb_agg(jsonb_build_object('task_name', t.name)) tasks
FROM project p
INNER JOIN task t ON t.project_id = p.id
WHERE p.id = $1 -- or whatever your selection condition is
group by p.id, p.name, p.creator_id;
如果project.id是主鍵,則
group by p.id, p.name, p.creator_id
可以簡化為
group by p.id;
我假設預期的 JSON 陣列結果是在邏輯層中或由 ORM 之類的東西形成的。如果您希望(順便說一句更好)查詢本身將結果作為 JSON 陣列回傳,那么
select jsonb_agg(to_josnb(t.*)) from
(
... the query above ...
) t;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/400982.html
標籤:sql PostgreSQL的 PG
