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