我不确定如何最好地表达这个问题。
假设我有一个UserSkill
,belongs_to :user
和belongs_to :skill
。我有一个Skill
的集合,从我有skill_ids
的数组,与.map(&:id)
一样。
我可以轻松地使用此数组执行IN
类UserSkill.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: 1
和User 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
对此有什么正确的查询?我应该如何开始这个问题呢?
答案 0 :(得分:3)
假设从User
到UserSkill
的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)