Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按关联计数排序,有联接但不包括的组?完全外接?_Sql_Ruby On Rails_Join - Fatal编程技术网

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”)
现在我们正在加入附加表,它说明了原始答案中的一个限制——它只在我们连接两个表时起作用。我现在更新了答案,以计算我们关心的联接表的不同出现次数。