在一个查询PostgreSQL中加载多个关系

问题描述 投票:0回答:1

有4个表。

  1. Snapmails 用户 Snapmail相机 相机

当用户添加一个snapmail时,假设用户的id是41,他创建的snapmail的id为1.他为5个摄像头创建了snapmail,他们有id为1,2,3,4,5

现在db中的snapmail会是这样的

ID | user_id | 
1  |   41    |

和snapmail_cameras将有

ID | camera_id | snapmail_id
 1 |     1     |     1
 2 |     2     |     1
 3 |     3     |     1
 4 |     4     |     1
 5 |     5     |     1

我试图获得所有短信片,这非常简单,select * from snapmails但我想在这有更多的东西。

用户名和Camera'name。

我试过这个。

SELECT sm.*, u.firstname || ' ' || u.lastname as fullname,cam.name
FROM snapmails as sm
INNER JOIN users as u ON sm.user_id = u.id
LEFT JOIN snapmail_cameras as sc ON sm.id = sc.snapmail_id
LEFT JOIN cameras as cam ON sc.camera_id = cam.id

这给了我想要的东西但是以不同的方式。我想从db获取一个snapmail,比如

 ID  | fullname | camera_names
 1   | Junaid F.|  Camera1, Camera2, Camera3

但我的询问是给我的

 ID  | fullname | camera_name
 1   | Junaid F.|  Camera1
 1   | Junaid F.|  Camera2
 1   | Junaid F.|  Camera3
 1   | Junaid F.|  Camera4
 1   | Junaid F.|  Camera5

相机表有一列name和用户的表有2列firstnamelastname。我的查询给了我所有结果,但每个摄像机只有一行,但我希望有一行所有摄像机名称。那可能吗?

更新:我在Ecto工作是否有可能将这一切包装在Ecto Query中?

database postgresql ecto
1个回答
0
投票

你可以使用string_agg

SELECT sm.id, u.firstname || ' ' || u.lastname as fullname, string_agg(cam.name, ',')
FROM snapmails as sm
INNER JOIN users as u ON sm.user_id = u.id
LEFT JOIN snapmail_cameras as sc ON sm.id = sc.snapmail_id
LEFT JOIN cameras as cam ON sc.camera_id = cam.id
group by 1, 2
© www.soinside.com 2019 - 2024. All rights reserved.