Rails按has_many的聚合进行选择和排序

时间:2012-11-02 04:38:17

标签: sql ruby-on-rails sum

我有一个课程模型,其中包含很多评论。我的评论模型有一个评级字段。我想要的是查询最受好评的课程。我想在SQL中执行此操作,以避免返回所有课程对象,然后尝试对它们进行排序和排序。

4 个答案:

答案 0 :(得分:2)

我会尝试这个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彼此不喜欢,这就是我使用子查询的原因。您可能希望首先尝试一个查询,但我怀疑它会起作用:)如果您不是只是数字的评级,但例如实际平均费率,您可以进行查询,如< / p>
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 

很可能不需要计数(*)&gt; 0,但为了防止我添加它,指出你应该避免除以0.

答案 1 :(得分:2)

您没有描述如何定义“评分最高”。您可能希望获得个人评分最高的课程:

Course.joins(:reviews).group("courses.id").order("reviews.rating desc")

或者您可能希望获得总评分最高的课程:

Course.joins(:reviews).group("courses.id").order("sum(reviews.rating) desc")

然后,根据您想要的任何标准,您可以致电first(10)以获得前十名。

答案 2 :(得分:0)

你可以试试这个

select  * from courses where review=(select max(rating) from table)

select top 1.* from courses order by review desc

答案 3 :(得分: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`