Sql Rails按has\u many的聚合进行选择和排序

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

我有一个有很多评论的课程模型。我的审查模型有一个评级字段。我想要的是查询排名靠前的课程。我希望在SQL中执行此操作,以避免返回所有课程对象,然后尝试对它们进行排序。

您可以尝试此操作

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的解决方案结合起来,得到了我需要的东西。