Sql 按关联计数排序,有联接但不包括的组?完全外接?
我想显示一个所有用户的列表,这些用户按关联帖子的数量排序Sql 按关联计数排序,有联接但不包括的组?完全外接?,sql,ruby-on-rails,join,Sql,Ruby On Rails,Join,我想显示一个所有用户的列表,这些用户按关联帖子的数量排序 用户有很多:帖子 帖子属于:用户 这个来自另一个SO问题的查询得到了正确排序的结果,但它不会返回任何由于内部联接而没有任何帖子的用户 User.joins(:posts.group('posts.User\u id').order('count(posts.User\u id)desc') 是否有任何方法可以恢复与所有用户的关系,首先是最高的帖子,最后是零(0)篇帖子?我尝试了以下操作,但返回了大量user\u id:nil、first\
用户有很多:帖子
帖子属于:用户
这个来自另一个SO问题的查询得到了正确排序的结果,但它不会返回任何由于内部联接而没有任何帖子的用户
User.joins(:posts.group('posts.User\u id').order('count(posts.User\u id)desc')
是否有任何方法可以恢复与所有用户的关系,首先是最高的帖子,最后是零(0)篇帖子?我尝试了以下操作,但返回了大量user\u id:nil、first\u name:nil等用户条目。在下面的查询中有0篇文章的用户似乎作为一个关系元素返回,所有值都设置为nil
User.joins('posts.User\u id=users.id')。group('posts.User\u id','users.id')。order('count(posts.User\u id)DESC')
我建议使用users
表中的LEFT
连接。这将确保如果您碰巧有未连接到任何用户的帖子
,它们将不会被包括在内。但是您仍然可以获得没有任何帖子的用户集
然后,您只需按users.id
进行分组,以确保每个用户返回一行
最后,我们要计算Post
行的不同出现次数。这将确保我们保持正确的计数,即使我们开始加入其他表
您应该能够使用以下内容:
User.joins("LEFT JOIN posts ON users.id = posts.user_id").group("users.id").order("COUNT(DISTINCT posts.id) DESC")
如果您想显示每个用户的帖子数
,您可以在选择中包含如下内容:
User.select("users.*, COUNT(DISTINCT posts.id) AS posts_count").joins("LEFT JOIN posts ON users.id = posts.user_id").group("users.id").order("COUNT(DISTINCT posts.id) DESC").each do |user|
puts user.posts_count
end
当我回到我的办公桌时,我会检查一下,但是看起来非常适合我需要的东西。谢谢工作起来很有魅力,但会导致另一个问题。我在主题
上有一个默认\u范围
,它删除了1个月前的那些内容。我想用default\u作用域内连接此表,但当我这样做时,顺序会重新排列。它仍然很接近,拥有高帖子数量的用户仍然处于榜首,但这不再是确切的顺序<代码>帖子。计数类似于8、12、21、7
和0都在末尾。完整查询类似于User.joins(:topics).joins(“用户的左加入订阅.id=posts.User\u id”).group(“users.id”).order(“count(posts.User\u id)DESC”)
主题中的代码是什么?当您执行您在评论中提到的查询时,控制台中的SQL输出是什么样子的?嗯,我没有立即看到什么会导致排序出现问题。有一件事要确保订单(:release)
不会在幕后搞砸:User.joins(:topics).joins(“用户上的左JOIN subscriptions.id=posts.User\u id”).where([“topics.release>?”,1.month.ago]).group(“users.id”).order(“count(posts.User\u id)DESC”)
现在我们正在加入附加表,它说明了原始答案中的一个限制——它只在我们连接两个表时起作用。我现在更新了答案,以计算我们关心的联接表的不同出现次数。