【问题标题】:How to aggregate two objects from same referenced table?如何从同一个引用表中聚合两个对象?
【发布时间】:2019-08-15 10:01:06
【问题描述】:

所以,我有一个属于成员表的表用户。

用户表是:

id, firstName, lastName

成员表是:其中 creatorId 也属于用户表。

id, userId, creatorId

我正在尝试使用聚合获取包含用户详细信息的 userId 和包含用户详细信息的 creatorId。

SELECT
member.id,
    json_agg(json_build_object('userId', user.id, 'firstName', user.firstName)) AS user,
    json_agg(json_build_object('userId', c.id, 'firstName', c.firstName)) AS creator

FROM
    member
    INNER JOIN user u ON member.userId = u.id
    INNER JOIN user c ON member.creatorId = user.id
GROUP BY
    am.id

我还想包括创建者的名字和姓氏,但我不知道该怎么做。请任何人帮忙。

【问题讨论】:

  • 3 个成员实例需要不同的表别名。

标签: sql postgresql aggregate


【解决方案1】:

我想你想要:

SELECT m.id,
       json_agg(json_build_object('userId', mu.id, 'firstName', mu.firstName)) AS user,
       json_agg(json_build_object('creatorId', mc.id, 'firstName', mc.firstName)) AS creator
FROM member m INNER JOIN
     member mu
     ON m.userId = mu.id INNER JOIN
     member mc
     ON m.creatorId = mc.id
GROUP BY m.id;

也就是说,我怀疑是否需要聚合。据推测,id 是主键。此外,您可能需要LEFT JOIN,以防任一字段为NULL。所以:

SELECT m.id,
       json_build_object('userId', mu.id, 'firstName', mu.firstName) AS user,
       json_build_object('creatorId', mc.id, 'firstName', mc.firstName) AS creator
FROM member m LEFT JOIN
     member mu
     ON m.userId = mu.id LEFT JOIN
     member mc
     ON m.creatorId = mc.id;

【讨论】:

    【解决方案2】:

    这只是改变了一些别名。您在“用户”上有两个 JOINS,因此您应该始终使用正确的别名来限定您的引用。

    SELECT
       m.id,
       json_agg(json_build_object('userId', u.id, 'firstName', u.firstName)) AS user,
       json_agg(json_build_object('userId', c.id, 'firstName', c.firstName)) AS creator
    
    FROM member as m
       INNER JOIN user u ON m.userId = u.id
       INNER JOIN user c ON m.creatorId = c.id -- this had user.id instead of c.id
    GROUP BY
        m.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      • 2018-04-21
      • 2019-06-10
      • 2017-08-22
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多