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