0

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

4

4 回答 4

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 互不喜欢,这就是我使用子查询的原因。您可能想先尝试一个查询,但我怀疑它会起作用:) 如果您不只关心评分数量,但例如实际平均评分,您可以进行如下查询

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 

很可能不需要 count(*) >0,但以防万一我添加了它,以指出您应该避免除以 0。

于 2012-11-02T12:48:24.503 回答
2

您没有描述如何定义“最高评价”。您可能想要个人评分最高的课程:

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

或者您可能想要总评分最高的课程:

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

然后在每一个上,您都可以first(10)根据您想要的任何标准调用以获得前十名。

于 2012-11-02T12:59:00.023 回答
0

你可以试试这个

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

或者

select top 1.* from courses order by review desc
于 2012-11-02T04:59:13.153 回答
0

试试这个

@courses = Course.find(:all, :joins => "INNER JOIN reviews ON reviews.courses_id = courses.id", :order => "reviews.rating DESC")

或原始 sql

`SELECT `courses`.* FROM `courses` INNER JOIN reviews ON reviews.courses_id = courses.id ORDER BY reviews.rating DESC`
于 2012-11-02T08:20:22.790 回答