有4个表。
当用户添加一个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列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