【问题标题】:loading multiple relations in one query PostgreSQL在一个查询中加载多个关系 PostgreSQL
【发布时间】:2019-02-21 08:37:22
【问题描述】:

有 4 张桌子。

  1. 快照邮件
    • 用户
    • 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

我正在尝试获取所有非常简单的快照邮件, 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 中?

【问题讨论】:

    标签: database postgresql ecto


    【解决方案1】:

    你可以使用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
    

    【讨论】:

    • 什么是按 1、2 分组?
    • 一点 SQL 俚语(无论如何都不是最佳实践)。这意味着按第一列和第二列分组。你也可以选择group by sm.id, fullname
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多