在一个查询中加载多个关系 PostgreSQL
loading multiple relations in one query PostgreSQL
有 4 个 table。
- 快照邮件
- 用户
- Snapmail 相机
- 相机
当用户添加 snapmail 时,假设用户的 ID 是 41
,他创建的 snapmail 的 id
为 1。他为 5 个摄像头创建了 snapmail,它们的 ID 为 1, 2, 3, 4, 5
现在数据库中的 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
我正在尝试获取所有 snapmail,这非常简单,
select * from snapmails
但我还想在其中添加 2 个内容。
用户名和相机名。
我已经试过了。
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
这给了我我想要的,但方式不同。我想从数据库中获取一个 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
相机 table 有一个列 name
,用户的 table 有 2 个列 firstname
和 lastname
。我的查询为我提供了所有结果,但每个摄像头只有一行,但我想要一行包含所有摄像头名称。这可能吗?
更新:
我在 Ecto
工作 是否可以将这一切包装在 Ecto Query 中?
您可以使用 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
有 4 个 table。
- 快照邮件
- 用户
- Snapmail 相机
- 相机
当用户添加 snapmail 时,假设用户的 ID 是 41
,他创建的 snapmail 的 id
为 1。他为 5 个摄像头创建了 snapmail,它们的 ID 为 1, 2, 3, 4, 5
现在数据库中的 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
我正在尝试获取所有 snapmail,这非常简单,
select * from snapmails
但我还想在其中添加 2 个内容。
用户名和相机名。
我已经试过了。
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
这给了我我想要的,但方式不同。我想从数据库中获取一个 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
相机 table 有一个列 name
,用户的 table 有 2 个列 firstname
和 lastname
。我的查询为我提供了所有结果,但每个摄像头只有一行,但我想要一行包含所有摄像头名称。这可能吗?
更新:
我在 Ecto
工作 是否可以将这一切包装在 Ecto Query 中?
您可以使用 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