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

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

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

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

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

enter image description here

Группы: введите описание изображения здесь

Членство : введите описание изображения здесь

0
user2799827 25 Фев 2020 в 00:42

2 ответа

Лучший ответ

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

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 и разбито в соответствии с вашим комментарием.

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

0
Mark Taylor 25 Фев 2020 в 11:11

В вашей модели возражений 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 определите отношения между группами и пользователями :

  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
Rashomon 25 Фев 2020 в 10:20