有4张桌子。
当用户添加快照邮件时,假设用户的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
,而用户表具有两列firstname
和lastname
。我的查询是给我所有结果,但每个摄像机只有一行,但是我想让所有摄像机名称都有一行。有可能吗?
更新:
我在Ecto
工作,是否可以将所有这些内容包装到Ecto Query中?
答案 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