Rails:按列数分组

时间:2014-09-18 02:24:52

标签: sql ruby-on-rails ruby-on-rails-4 arel

我不确定如何最好地表达这个问题。

假设我有一个UserSkillbelongs_to :userbelongs_to :skill。我有一个Skill的集合,从我有skill_ids的数组,与.map(&:id)一样。

我可以轻松地使用此数组执行INUserSkill.where(skill_id: skill_ids)类型的查询。

但我希望从我的输入中找到拥有最多技能的用户。

我尝试将这个天真地写为UserSkill.where(skill_id: skill_ids).group("user_skills.user_id").order("count(user_skills.user_id) desc"),但这有语法错误。

为了进一步澄清,我们假设我们有User id: 1User id: 2。我们UserSkill.where(skill_id: skill_ids)的结果如下:

  • UserSkill user_id: 1, skill_id: 1
  • UserSkill user_id: 1, skill_id: 2
  • UserSkill user_id: 2, skill_id: 2

我要找的结果是:

  • User id: 1
  • User id: 2

对此有什么正确的查询?我应该如何开始这个问题呢?

2 个答案:

答案 0 :(得分:3)

假设从UserUserSkill的has_many关联,您可以尝试

User.joins(:user_skills).
  group("users.id").
  order("COUNT(users.id) DESC").
  merge(UserSkill.where(skill_id: skill_ids))

答案 1 :(得分:1)

在SQL中我可能写这个:

select users.*
from users
  join user_skills on users.id = user_skills.user_id
where 
  user_skills.skill id in (1,2,3)
group by users.id
order by count(*) desc, users.id asc
limit 5

可能如下所示:

User.joins("user_skills on users.id = user_skills.user_id").
     where("user_skills.skill_id" => skill_ids).
     group("users.id").
     order("count(*) desc").
     limit(5)