Sql Rails按has\u many的聚合进行选择和排序
我有一个有很多评论的课程模型。我的审查模型有一个评级字段。我想要的是查询排名靠前的课程。我希望在SQL中执行此操作,以避免返回所有课程对象,然后尝试对它们进行排序。您可以尝试此操作Sql Rails按has\u many的聚合进行选择和排序,sql,ruby-on-rails,sum,Sql,Ruby On Rails,Sum,我有一个有很多评论的课程模型。我的审查模型有一个评级字段。我想要的是查询排名靠前的课程。我希望在SQL中执行此操作,以避免返回所有课程对象,然后尝试对它们进行排序。您可以尝试此操作 select * from courses where review=(select max(rating) from table) 或 你可以试试这个 select * from courses where review=(select max(rating) from table) 或 试试这个 @cou
select * from courses where review=(select max(rating) from table)
或
你可以试试这个
select * from courses where review=(select max(rating) from table)
或
试试这个
@courses=Course.find(:all,:joins=>“reviews.courses上的内部连接评论”\u 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`
试试这个
@courses=Course.find(:all,:joins=>“reviews.courses上的内部连接评论”\u 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`
我会尝试以下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中的经验是GROUPBY和ORDERBY彼此不喜欢,这就是我使用子查询的原因。不过,您可能想先尝试一个查询,但我怀疑它是否会起作用:)如果您对评级的数量不感兴趣,但例如实际平均评级,您可以像这样进行查询
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除,我添加了count(*)>0
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中的经验是GROUPBY和ORDERBY彼此不喜欢,这就是我使用子查询的原因。不过,您可能想先尝试一个查询,但我怀疑它是否会起作用:)如果您对评级的数量不感兴趣,但例如实际平均评级,您可以像这样进行查询
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。您没有描述如何定义“最高评级”。您可能希望课程具有最高的个人评分:
Course.joins(:reviews).group("courses.id").order("reviews.rating desc")
Course.joins(:reviews).group("courses.id").order("sum(reviews.rating) desc")
或者,您可能需要总评分最高的课程:
Course.joins(:reviews).group("courses.id").order("reviews.rating desc")
Course.joins(:reviews).group("courses.id").order("sum(reviews.rating) desc")
然后,您可以调用
第一(10)
,根据您想要的标准获得前十名。您没有描述如何定义“最高评级”。您可能希望课程具有最高的个人评分:
Course.joins(:reviews).group("courses.id").order("reviews.rating desc")
Course.joins(:reviews).group("courses.id").order("sum(reviews.rating) desc")
或者,您可能需要总评分最高的课程:
Course.joins(:reviews).group("courses.id").order("reviews.rating desc")
Course.joins(:reviews).group("courses.id").order("sum(reviews.rating) desc")
然后,你可以调用
first(10)
,根据你想要的标准来获得前十名。我实际上想要最高的平均评分,所以第二个接近,但我需要除以总评分来获得平均值。这似乎有效:“.order”(.sum(reviews.rating)/count(*))。如果您想要平均值,您可能可以执行.order(“avg(reviews.rating)”)
'avg',更好!希望我能再次投票。你知道如何在没有任何评论的情况下包含课程吗?因为现在我只获取有评论的课程,所以我会进行后续查询以获取更多。如果你使用课程。包含(:评论)
它应该做一个外部连接,它将引入没有评论的课程。对不起,它应该是包含而不是包含。所以课程。包括(:评论)
等等。我实际上想要最高的平均评论,所以第二个接近,但是我需要除以总数来获得平均值。这似乎有效:.order(“sum(reviews.rating)/count(*))。如果你想要平均值,你可以做.order(“avg(reviews.rating)”)
“avg”,甚至更好!但愿我能再次投票。你知道如何在没有任何评论的情况下加入课程吗?因为现在我只得到那些有评论的课程,所以我做了一个后续查询来获取更多。如果你使用课程。包含(:评论)
它应该做一个外部连接,它将引入没有评论的课程。对不起,它应该是包含而不是包含。所以课程。包括(:评论)
等。谢谢你关于平均分的建议。我把它和Shadwell的解决方案结合起来,得到了我所需要的。谢谢你关于平均值的建议。我把它和Shadwell的解决方案结合起来,得到了我需要的东西。