в SQL Попытка вернуть всех пользователей, которые являются членами тех же групп, что и указанный c пользователь - PullRequest
0 голосов
/ 25 февраля 2020

Этот запрос меня немного оборачивает. В базе данных Postgresql (Express / Knex / Objection) у меня есть три таблицы: «Пользователи», «Группы» и ассоциативная таблица. Членство. St Пользователи имеют «много групп» через членство.

. хотите вернуть всех других пользователей, которые имеют членство в этих группах.

, чтобы ответить на вопросы ниже, учитывая, что одному пользователю я хочу вернуть всех других отдельных пользователей, которые принадлежат к какой-либо группе, в которую также входит первый пользователь.

Я думаю, что меня смущает факт что у меня есть пользователи с обеих сторон соединения. Я думаю, что люди решали это много раз, но я не нахожу никаких примеров в Интернете. По запросам, включая схему таблицы:

Пользователи:

enter image description here

Группы: enter image description here

Членство: enter image description here

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

В вашей модели возражения User определите отношение между пользователями и группами :

  static relationMappings = {
    groups: {
      relation: Model.ManyToManyRelation, // An user has many groups
      modelClass: Group,
      join: {
        from: 'users.id',
        through: {
          from: 'memberhips.users_id',
          to: 'memberhips.groups_id'
        },
        to: 'groups.id'
      }
    }
  }

Затем в своей модели возражения Group определите отношения между groups and users :

  static relationMappings = {
    users: {
      relation: Model.ManyToManyRelation, // A group has many users
      modelClass: User,
      join: {
        from: 'groups.id',
        through: {
          from: 'memberhips.groups_id',
          to: 'memberhips.users_id'
        },
        to: 'users.id'
      }
    }
  }

Затем используйте готовую загрузку для загрузки отношений:

User.query().eager('groups.[users]').findById(userId)

Запрос должен возвращать такую ​​структуру (некоторые свойства, такие как address игнорируются):

User {
  id: 3,
  name: 'name',
  description: 'description',
  groups: [ // User 3 has two groups: 1 and 2
    {
        id: 1,
        name: 'name1',
        users: [ // There are two member of group, 3 and 6
            {
                id: 3,
                name: 'name',
                description: 'description'
            },
            {
                id: 6,
                name: 'other',
                description: 'other'
            }
        ]
    },
    {
        id: 2,
        name: 'name2',
        users: [
            {
                id: 3,
                name: 'name',
                description: 'description'
            },
            {
                id: 7,
                name: 'another',
                description: 'another'
            }
        ]
    },
  ]
}
0 голосов
/ 25 февраля 2020

Хорошо, теперь комментарий имеет больше смысла, и я соответственно отредактировал решение.

select 
    distinct u.user.id

from users u
join memberships m on u.id = m.users_id

where m.groups_id in 

    (//this is the subquery to get the groups of the initial user)
    select 
        m.groups_id

    from memberships m

    where m.users_id = [user_1] //this is where you set your initial user
    ) subQuery

Есть несколько способов сделать это, но это в традиционном стиле SQL и разбито согласно вашему комментарию.

Это вернет просто отдельный список пользователей по запросу - добавьте дополнительные столбцы в верхнем списке, чтобы получить дополнительную информацию по мере необходимости.

...