繁体   English   中英

按关联计数排序,加入联接但不包含联接? 全部加入?

[英]Order by association count, group with join but include none? FULL OUTER JOIN?

我想显示按相关帖子数排序的所有用户的列表。

user has_many :posts

posts belong_to :user

这个来自另一个SO问题的查询使我正确地排序了结果,但是由于内部联接,它不返回没有帖子的任何用户。

User.joins(:posts).group('posts.user_id').order('count(posts.user_id) desc')

有什么方法可以让所有用户重新获得联系,最高的帖子优先,最后的nil(0)个帖子? 我尝试了以下操作,但获得了大量user_id: nil, first_name: nil, etc用户条目。 似乎在以下查询中帖子为0的用户将作为关系元素返回,且所有值均设置为nil

User.joins('FULL OUTER JOIN posts ON posts.user_id = users.id').group('posts.user_id', 'users.id').order('count(posts.user_id) DESC')

我建议从users表中使用LEFT 这样可以确保,如果您碰巧有未与任何users连接的posts ,则不会包含这些posts 但是您仍然会找回没有postsusers

然后,您只需users.id ,以确保每个User返回一行。

最后,我们要计算Post行的不同出现次数。 即使我们开始与其他表联接,这也可以确保我们保持正确的计数。

您应该可以使用以下内容:

User.joins("LEFT JOIN posts ON users.id = posts.user_id").group("users.id").order("COUNT(DISTINCT posts.id) DESC")

如果要显示每个Userposts数,则可以将其包含在选择中,例如:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM