[英]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
。 但是您仍然会找回没有posts
的users
。
然后,您只需users.id
,以确保每个User
返回一行。
最后,我们要计算Post
行的不同出现次数。 即使我们开始与其他表联接,这也可以确保我们保持正确的计数。
您应该可以使用以下内容:
User.joins("LEFT JOIN posts ON users.id = posts.user_id").group("users.id").order("COUNT(DISTINCT posts.id) DESC")
如果要显示每个User
的posts
数,则可以将其包含在选择中,例如:
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.