我正在为客户项目构建拖放功能,并且需要我的数据如下所示:
[ [Array(10)], [Array(5)], [Array(5)], [Array(5)], [Array(5)] ]
每个数组看起来像这样(每个数组都代表患者):
[ {id: 1, reccomendations: [array] } ]
更深一层的推荐数组将如下所示:
["providerName1", "providerName2", "providerName3"]
我的数据库是这样设置的:
病人表
+----+-----------+
| id | bucket_id |
+----+-----------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 2 |
| 8 | 3 |
| 9 | 4 |
| 10 | 5 |
+----+-----------+
患者_provider 表
provider_id 引用 provider.id
患者_id 引用 patiend.id
+----+-------------+-------------+
| id | provider_id | patient_id |
+----+-------------+-------------+
| 1 | 1 | 1 |
| 2 | 7 | 1 |
| 3 | 3 | 1 |
| 4 | 1 | 2 |
| 5 | 8 | 3 |
| 6 | 7 | 3 |
| 7 | 3 | 4 |
| 8 | 2 | 5 |
| 9 | 11 | 5 |
| 10 | 1 | 6 |
+----+-------------+-------------+
提供者表
provider_id 引用 provider.idpatient_id
引用 patiend.id
+----+-------------+-------------+
| id | provider_id | patient_id |
+----+-------------+-------------+
| 1 | 1 | 1 |
| 2 | 7 | 1 |
| 3 | 3 | 1 |
| 4 | 1 | 2 |
| 5 | 8 | 3 |
| 6 | 7 | 3 |
| 7 | 3 | 4 |
| 8 | 2 | 5 |
| 9 | 11 | 5 |
| 10 | 1 | 6 |
+----+-------------+-------------+
提供者表
有比这更多的行和列,但这是我唯一需要的列
+----+-----------+
| id | program |
+----+-----------+
| 1 | blue |
| 2 | red |
| 3 | green |
| 4 | yellow |
| 5 | pink |
| 6 | teal |
+----+-----------+
我已经运行了这个:
SELECT "patient".id, ARRAY_AGG(DISTINCT("provider".program)) as providers FROM "patient"
LEFT JOIN "patient_provider" ON "patient_provider".patient_id = "patient".id
LEFT JOIN "provider" ON "provider".id = "patient_provider".provider_id
GROUP BY "patient".id
ORDER BY "patient".id ASC;
这将使我获得每位患者的提供者数组。
我也运行了这个:
SELECT JSON_AGG("patient") as patient FROM "patient"
WHERE "patient".bucket_id =1;
有了这个,我可以获得所有的桶/列和属于这些列的患者。
我一直无法找到将两者组合成我需要的数据结构的方法。我已经阅读了一些关于 JSON Build Objects 的文章——这是要走的路吗?我该怎么做?我也愿意在服务器端执行此工作流程,使用函数拼接并手动获取我需要的数据结构……如果这是更好的方法的话。如果你认为这是要走的路,我会怎么做?
我会买咖啡给能帮我解决这个问题的人!我很想通过为他们构建这个功能来让我的客户开心!
我用以下语句重新创建了您的案例
create table patient (id serial, bucket_id int);
insert into patient (bucket_id) values (1);
insert into patient (bucket_id) values (2);
insert into patient (bucket_id) values (3);
insert into patient (bucket_id) values (4);
insert into patient (bucket_id) values (5);
insert into patient (bucket_id) values (6);
insert into patient (bucket_id) values (2);
insert into patient (bucket_id) values (3);
insert into patient (bucket_id) values (4);
insert into patient (bucket_id) values (5);
create table patient_provider (id serial, provider_id int, patient_id int);
insert into patient_provider (provider_id, patient_id) values (1,1);
insert into patient_provider (provider_id, patient_id) values (7,1);
insert into patient_provider (provider_id, patient_id) values (3,1);
insert into patient_provider (provider_id, patient_id) values (1,2);
insert into patient_provider (provider_id, patient_id) values (8,3);
insert into patient_provider (provider_id, patient_id) values (7,3);
insert into patient_provider (provider_id, patient_id) values (3,4);
insert into patient_provider (provider_id, patient_id) values (2,5);
insert into patient_provider (provider_id, patient_id) values (11,5);
insert into patient_provider (provider_id, patient_id) values (1,6);
create table provider (id serial, program varchar);
insert into provider (program) values ('blue');
insert into provider (program) values ('red');
insert into provider (program) values ('green');
insert into provider (program) values ('yellow');
insert into provider (program) values ('pink');
insert into provider (program) values ('teal');
现在,进行您的第一个查询,并使用该json_build_object
函数,您可以实现{id: 1, reccomendations: [array] }
(实际上并不需要外部数组)。查询如下
SELECT json_build_object('id',"patient".id, 'reccomendations', ARRAY_AGG(DISTINCT("provider".program))) as obj FROM "patient"
LEFT JOIN "patient_provider" ON "patient_provider".patient_id = "patient".id
LEFT JOIN "provider" ON "provider".id = "patient_provider".provider_id
GROUP BY "patient".id
ORDER BY "patient".id ASC
结果是
obj
-------------------------------------------------------
{"id" : 1, "reccomendations" : ["blue","green",null]}
{"id" : 2, "reccomendations" : ["blue"]}
{"id" : 3, "reccomendations" : [null]}
{"id" : 4, "reccomendations" : ["green"]}
{"id" : 5, "reccomendations" : ["red",null]}
{"id" : 6, "reccomendations" : ["blue"]}
{"id" : 7, "reccomendations" : [null]}
{"id" : 8, "reccomendations" : [null]}
{"id" : 9, "reccomendations" : [null]}
{"id" : 10, "reccomendations" : [null]}
(10 rows)
现在,如果您想聚合上述结果,您可以使用该json_agg
函数来进行。这是整体代码
With single_objects as (
SELECT json_build_object('id',"patient".id, 'reccomendations', ARRAY_AGG(DISTINCT("provider".program))) as obj FROM "patient"
LEFT JOIN "patient_provider" ON "patient_provider".patient_id = "patient".id
LEFT JOIN "provider" ON "provider".id = "patient_provider".provider_id
GROUP BY "patient".id
ORDER BY "patient".id ASC
)
select json_agg(obj) from single_objects
和结果
json_agg
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[{"id" : 1, "reccomendations" : ["blue","green",null]}, {"id" : 2, "reccomendations" : ["blue"]}, {"id" : 3, "reccomendations" : [null]}, {"id" : 4, "reccomendations" : ["green"]}, {"id" : 5, "reccomendations" : ["red",null]}, {"id" : 6, "reccomendations" : ["blue"]}, {"id" : 7, "reccomendations" : [null]}, {"id" : 8, "reccomendations" : [null]}, {"id" : 9, "reccomendations" : [null]}, {"id" : 10, "reccomendations" : [null]}]
(1 row)
如果你真的需要为每个id做额外的数组封装,你只需要在上面提到json_build_array
的json_build_object
调用中添加一个函数即可。完整查询
With single_objects as (
SELECT json_build_array(json_build_object('id',"patient".id, 'reccomendations', ARRAY_AGG(DISTINCT("provider".program)))) as obj FROM "patient"
LEFT JOIN "patient_provider" ON "patient_provider".patient_id = "patient".id
LEFT JOIN "provider" ON "provider".id = "patient_provider".provider_id
GROUP BY "patient".id
ORDER BY "patient".id ASC
)
select json_agg(obj) from single_objects
最终结果
json_agg
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[[{"id" : 1, "reccomendations" : ["blue","green",null]}], [{"id" : 2, "reccomendations" : ["blue"]}], [{"id" : 3, "reccomendations" : [null]}], [{"id" : 4, "reccomendations" : ["green"]}], [{"id" : 5, "reccomendations" : ["red",null]}], [{"id" : 6, "reccomendations" : ["blue"]}], [{"id" : 7, "reccomendations" : [null]}], [{"id" : 8, "reccomendations" : [null]}], [{"id" : 9, "reccomendations" : [null]}], [{"id" : 10, "reccomendations" : [null]}]]
(1 row)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句