Rails按has_many的聚合进行选择和排序
我有一个课程模型,有很多评论。 我的评论模型有一个评级字段。 我想要的是查询最受好评的课程。 我想在SQL中执行此操作,以避免返回所有课程对象,然后尝试对它们进行排序和排序。
您没有描述如何定义“最高评分”。 可能你想要个人评分最高的课程:
Course.joins(:reviews).group("courses.id").order("reviews.rating desc")
或者您可能希望获得总评分最高的课程:
Course.joins(:reviews).group("courses.id").order("sum(reviews.rating) desc")
然后在每个上面你可以first(10)
调用first(10)
以你想要的任何标准获得前十名。
我会尝试这个SQL:
SELECT courses.* FROM (SELECT courses.*, count(*) as rating_no FROM courses JOIN reviews ON reviews.course_id = courses.id GROUP BY reviews.course_id ) as res ORDER BY rating_no DESC
想法:您首先获取每门课程的所有数据以及评分数量。 然后你只是对它们进行排序 我在MySQL中的经验是GROUP BY和ORDER BY彼此不喜欢,这就是我使用子查询的原因。 你可能想先尝试一个查询,但我怀疑它会起作用:)如果你不是仅仅在数量的评级,但例如实际平均费率,你可以进行查询
SELECT courses.* FROM (SELECT courses.*, (SUM(reviews.rating)/count(*)) as avg_rating FROM courses JOIN reviews ON reviews.course_id = courses.id GROUP BY reviews.course_id HAVING count(*) > 0) as res ORDER BY rating_no DESC
最有可能不需要计数(*)> 0,但为了防止我添加它,指出你应该避免除以0。
试试这个
@courses = Course.find(:all, :joins => "INNER JOIN reviews ON reviews.courses_id = courses.id", :order => "reviews.rating DESC")
或RAW sql
`SELECT `courses`.* FROM `courses` INNER JOIN reviews ON reviews.courses_id = courses.id ORDER BY reviews.rating DESC`
你可以试试这个
select * from courses where review=(select max(rating) from table)
要么
select top 1.* from courses order by review desc