【问题标题】:SQL - Get AVG from count from another tableSQL - 从另一个表的计数中获取 AVG
【发布时间】:2017-09-11 19:19:51
【问题描述】:

所以我有 2 个表:列表和评论。 我试图获得具有最佳评论的列表,该列表位于某个州。因此,我需要从列表的所有评论中获取 AVG,然后对列表进行 DESC。

表结构: 清单:id;标题;状态; ...

评论: ID;列表ID;评分(从 1 到 5)

我只能解决最多评论的 DESC 列表,但现在我尝试获取评论评分的 AVG。

SELECT *,
       (SELECT COUNT(*) 
          FROM reviews rv 
         WHERE ls.id = rv.listing_id) Count 
  FROM listing ls 
 WHERE ls.state ='$get_state' 
 ORDER BY Count DESC

样本数据:

Listing:

id title                State 
1  Hotel with nice view Arizona
2  Hotel to stay        Arizona

Review:

id listing_id rating
1  1          4(stars)
2  1          4(stars)
3  1          3(stars)
4  2          5(stars)

列表 id 1 获得 3 条评论,总星值为 11 / 3 条评论 = 3.6 颗星

列表 id 2 获得 1 条评论,总星值为 5 / 1 = 5 星

现在我应该先得到清单 2,然后得到清单 1 我想在 PHP 页面上显示整个内容。

接下来我能做什么? 感谢您的帮助

【问题讨论】:

  • 提供样本数据和预期结果
  • @FerdinandGaspar 完成,谢谢
  • 请标记您正在使用的 RDBMS
  • @FerdinandGaspar 我还有一个问题...我添加了必须确认电子邮件才能解锁评论的功能。现在我在审查表中有一个名为 mail_approved 的列。问题是我只需要获得 mail_approved = 1 的评论的 AVG 评级。我在哪里可以添加这个子句?我必须重新格式化整个查询吗?非常感谢!

标签: sql count average


【解决方案1】:

你可以使用 AVG() 函数来获得平均评分

SELECT ls.id,
       title,
       state,
       ROUND(AVG(rating),2) avg_rating
  FROM listing ls
  JOIN review rv
    ON ls.id = rv.listing_id
 WHERE ls.state = '$get_state'
 GROUP BY ls.id,
          title,
          state
 ORDER BY avg_rating DESC

如果您使用 MSSQL,CAST 列评级以获取小数精度(作为浮点数或小数)

ROUND(AVG(CAST(rating AS FLOAT)),2) avg_rating

【讨论】:

  • 谢谢!工作顺利!
  • 我还有一个问题...我添加了必须确认电子邮件才能解锁评论的功能。现在我在审查表中有一个名为 mail_approved 的列。问题是我只需要获得 mail_approved = 1 的评论的 AVG 评级。我在哪里可以添加这个子句?我必须重新格式化整个查询吗?非常感谢!
猜你喜欢
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 2010-09-18
  • 2010-10-22
相关资源
最近更新 更多