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