mysql - 查询两个用户之间的公共(public)组

标签 mysql ruby-on-rails rails-activerecord

我想查询两个用户之间的公共(public)组。

这是我的模型:

用户模型

class User < ActiveRecord::Base
  has_many :group_memberships
  has_many :groups, through: :group_memberships
end

组模型

class Group < ActiveRecord::Base
  has_many :group_memberships
  has_many :users, through: :group_memberships
end

连接用户和组之间的表模型

class GroupMembership < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end

比方说,我有两个用户 A 和 B,我想获得用户 A 和用户 B 是共同成员的组。

例如:

用户 A 是组 [W, X, Y] 的成员

用户 B 是组 [W, X, Z] 的成员

使用此查询,预期答案将是组 [W, X]

(Groups_From_A ∩ Groups_From_B)

我已经找到了一些答案,但他们不仅仅使用事件记录:

user_a.groups & user_b.groups

我不想在内存中这样做,而是在数据库中。

最佳答案

我做到了!!\o/

在@zerkms 先生的帮助下,答案已发布 here .

好吧,我知道这很棘手,但结果比我想象的要容易。

最终查询:

Group.joins(:users).where(users: { id: [user_a.id, user_b.id] }).group("groups.id").having("COUNT(users.id)=2")

说明:

我从用户 A 和 B 查询组:

Group.joins(:users).where(users: { id: [user_a.id, user_b.id] }).(...)

它给了我一个数组,其中包含来自两个用户的所有组,甚至是重复的。

所以我将它们分组并得到 2 的计数。因为当我们重复一个组时,这意味着该组是从用户 A 和用户 B 查询的。

   (...).group("groups.id").having("COUNT(users.id)=2")

它运行良好,但如果您有更好或不同的解决方案,我将很高兴看到。

谢谢大家,也谢谢 @zerkms 先生,我只是将您的回答“翻译”到了 RoR。

关于mysql - 查询两个用户之间的公共(public)组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29977075/

相关文章:

mysql - 在 MySQL 查询中选择最后一行和列的总和

php - 我的电子商务网站购物车中的所有书籍都没有插入到数据库表中。

MySQL INSERT 到联结表

java - 将数据从 java 程序存储到 MySQL 的最简单方法是什么?

ruby-on-rails - 通过定义虚拟属性在 Rails 表单验证中获取 current_user

ruby-on-rails - 使用模型的委托(delegate)字段进行 Rails 查询

mysql - Rails 临时表

ruby-on-rails - Rails - 这是不好的做法还是可以优化?

ruby-on-rails - 如何使用 Hstore 键在 ActiveRecord 查询上使用 group by 子句?

ruby-on-rails - Rails 会自动优化查询吗