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

时间:2019-02-21 08:37:23

标签: database postgresql ecto

有4张桌子。

  1. Snapmails
    • 用户
    • Snapmail相机
      • 相机

当用户添加快照邮件时,假设用户的ID为41,而他创建的快照邮件的id为1,并且他为5个摄像机创建了快照邮件,其ID为1、2 3、4、5

现在db中的快照邮件看起来像

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,但我想再做两件事。

用户名和相机名。

我已经尝试过了。

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

这以不同的方式给了我我想要的东西。我想从数据库获取快照邮件,例如

 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,而用户表具有两列firstnamelastname。我的查询是给我所有结果,但每个摄像机只有一行,但是我想让所有摄像机名称都有一行。有可能吗?

更新: 我在Ecto工作,是否可以将所有这些内容包装到Ecto Query中?

1 个答案:

答案 0 :(得分: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