Как отсортировать список на основе подзапроса? - PullRequest
0 голосов
/ 01 мая 2020

Я хочу отсортировать данные команд по членству, я написал 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 голосов
/ 01 мая 2020

Просто добавьте 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() с подзапросом. Кажется, они эквивалентны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...