如何根据子查询对列表进行排序?

时间:2020-05-01 08:44:53

标签: sql postgresql

我想根据成员资格对团队数据进行排序,我已经按照以下方式编写了sql,但我不确定如何根据成员数量添加排序。请大家帮忙。

SELECT
    t.name,
    t.description,
    ARRAY (
        SELECT
            json_build_object('id', tm.id, 'owner', tm.owner, 'person', json_build_object('id', p.id, 'name', p.name, 'email', p.email))
        FROM
            membership tm
            INNER JOIN person p ON p.id = tm.personId
        WHERE
            tm.teamid = t.id) AS membership
    FROM
        team AS t
    WHERE
        t.id = 1;

所以上面的代码为我提供了以下数据

 [
  {
    id: 1,
    name: 'Coco cola',
    description: 'drink',
    membership: [{
      id: 12,
      owner: false,
      person: {
        name: 'john deo',
        'email': 'email@hotmail.com'
      }
    }, {
      id: 122,
      owner: false,
      person: {
        name: 'peter deo',
        'email': 'peter@hotmail.com'
      }
    }]
  }, {
    id: 2,
    name: 'fanta',
    description: 'drink',
    membership: [{
      id: 13,
      owner: false,
      person: {
        name: 'rose',
        'email': 'rose@hotmail.com'
      }
    }, {
      id: 172,
      owner: false,
      person: {
        name: 'david',
        'email': 'david@hotmail.com'
      }
    }]
  }
 ]

我的表格是:

team (id, name, description)
membership (id, owner, teamId, personId )
person (id, name, email)

我要做的是根据成员人数对团队进行排序。

1 个答案:

答案 0 :(得分:0)

只需将ORDER BY添加到外部查询即可。在这种情况下,我将使用相关子查询:

SELECT t.name, t.description,
       (SELECT ARRAY_AGG(json_build_object('id', tm.id, 'owner', tm.owner, 'person',
                                           json_build_object('id', p.id, 'name', p.name, 'email', p.email)
                                          )
                        )
        FROM membership tm JOIN
             person p
             ON p.id = tm.personId
        WHERE tm.teamid = t.id
      ) membership
FROM team t
WHERE a.id = 1  -- this is invalid because `a` does not refer to anything
ORDER BY (SELECT COUNT(*) FROM membership tm WHERE tm.teamid = t.id) DESC;

我碰巧用ARRAY_AGG()而不是ARRAY()编写子查询。它认为它们是等效的。

相关问题