按关联顺序排序,加入组但不包括?完全外联?

时间:2014-09-07 18:28:13

标签: sql ruby-on-rails join

我希望按照相关帖子的数量显示所有用户的列表。

user has_many :posts

posts belong_to :user

来自另一个SO问题的查询得到了我正确排序的结果,但它没有返回因内部联接而没有任何帖子的任何用户。

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

有没有办法让所有用户恢复关系,最高帖子优先和零(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')

1 个答案:

答案 0 :(得分:1)

我建议使用LEFT表中的users联接。这将确保如果您碰巧posts未与任何users相关联,则无法将其包括在内。但是你仍然可以找回那些没有users的{​​{1}}。

然后,您只想按posts进行分组,以确保每users.id行返回一行。

最后,我们要计算User行的不同出现次数。这将确保我们保持正确的计数,即使我们开始加入其他表格。

你应该能够使用这样的东西:

Post

如果您想显示每个User.joins("LEFT JOIN posts ON users.id = posts.user_id").group("users.id").order("COUNT(DISTINCT posts.id) DESC") 的{​​{1}}计数,您可以在选择中包含以下内容:

posts