Sql 如何通过关联表检索一组用户共同拥有的关联对象/记录?

Sql 如何通过关联表检索一组用户共同拥有的关联对象/记录?,sql,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,Sql,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,我使用的是RubyonRails3.2.2,我想检索两个或更多用户同时关联的对象/记录。也就是说,我有一个数据库表,存储用户和文章之间的关联数据;我想“构建”一个SQL查询,以便检索两个或多个用户关联的文章。例如,如果我有以下关联对象 #<UserArticleAssociation id: 1, user_id: 1, article_id: 1> #<UserArticleAssociation id: 2, user_id: 1, article_id: 2> #&

我使用的是RubyonRails3.2.2,我想检索两个或更多用户同时关联的对象/记录。也就是说,我有一个数据库表,存储用户和文章之间的关联数据;我想“构建”一个SQL查询,以便检索两个或多个用户关联的文章。例如,如果我有以下关联对象

#<UserArticleAssociation id: 1, user_id: 1, article_id: 1>
#<UserArticleAssociation id: 2, user_id: 1, article_id: 2>
#<UserArticleAssociation id: 3, user_id: 1, article_id: 3>
#<UserArticleAssociation id: 4, user_id: 2, article_id: 1>
#<UserArticleAssociation id: 5, user_id: 2, article_id: 2>    
#<UserArticleAssociation id: 6, user_id: 3, article_id: 1>
#<UserArticleAssociation id: 7, user_id: 3, article_id: 3>
#<UserArticleAssociation id: 8, user_id: 4, article_id: 4>
用于组合关系:

articles = @user1.articles.merge(@user2.articles)
这将为您提供
@user1
&
@user2
共享的所有文章。您可以进一步调用
merge
,为文章添加其他关系,例如:

articles = @user1.articles.merge(@user2.articles).merge(@user3.articles)

也许像这样的方法会奏效:

Article.joins(:users).where('users.id in (?)', my_users.map(&:id)).group('articles.id')

你应该使用having子句和groupby

Article.joins(:user_article_associations).
where('user_article_associations.user_id in (?)', users_ids)).
group('articles.id').
having('COUNT(user_article_associations.user_id in (?)) = ?',users_ids, users_ids.size)

你能解释一下第一个例子中返回结果的
@user1
@user2
之间的关系吗?@Jesse Wolgamott-我更新了这个问题。这里的“关联方式”真的有意义吗?你要做的不就是让所有的文章关联都属于一组用户吗?UserArticleAssociation看起来像什么?@Andrew Marshall-我试图让一个或多个用户同时关联所有文章。@user502052“同时”是什么意思?您想要一篇文章与给定用户关联的关联吗?但是,您的第二个示例没有做到这一点。您的第四个和第五个也不能,因为它们只返回一个关联,这是不可能的,因为每个用户都有一个关联,并且必须提供多个用户。可以在单个SQL查询中实现吗?@user502052我不这么认为。如果是这样的话,这将是相当复杂的,而且可能无法在纯ActiveRecord中实现。也许可以通过明智地使用SQL
/
子句(或其他一些我不知道的SQL子句)来实现这一点,但我无法找到方法@user502052您可能可以使用分组的自联接和虚拟列来进行此操作,但是您需要为您正在查询的N个用户提供N个自联接。目前,我认为最好将评级保留为
0
,然后(也就是说,只有在链接的问题(上一条评论中的问题)得到回答后)进行投票(如果这个链接的问题成功了)/记下(否则)你的答案。我也认为你的“then”是这个意思。
Article.joins(:users).where('users.id in (?)', my_users.map(&:id)).group('articles.id')
Article.joins(:user_article_associations).
where('user_article_associations.user_id in (?)', users_ids)).
group('articles.id').
having('COUNT(user_article_associations.user_id in (?)) = ?',users_ids, users_ids.size)