You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL8查询餐厅近12个月平均评分及全部历史评分总数

问题原因分析

你编写的SQL存在两个核心错误:

  1. 使用GROUP BY r.Id按单条评分ID分组,每一组仅包含1条数据,因此COUNT(r.Id)的结果必然全为1,无法实现聚合统计的效果。
  2. WHERE条件中加入了近12个月的时间过滤,只能查询到符合时间要求的评分,无法统计该餐厅所有历史的评价总数量。

正确实现方案

可以通过条件聚合一次性查询得到两个所需指标,无需多次查表:

SELECT 
  -- 计算近12个月平均评分,保留1位小数,无符合条件评分时返回0
  ROUND(IFNULL(AVG(IF(r.CreatedAt > NOW() - INTERVAL 12 MONTH, r.Rating, NULL)), 0), 1) AS avg_rating,
  -- 统计该餐厅所有历史评分总数量
  COUNT(r.Id) AS total_rating_count
FROM `Order` o
INNER JOIN Rating r ON o.Id = r.OrderId
WHERE o.RestaurantId = 1;

逻辑说明

  • 首先关联查询指定餐厅的所有历史评分,不额外加时间过滤,保证COUNT可以统计到全部历史评价总数。
  • 计算平均分时通过IF条件做筛选,只有近12个月的评分才会参与平均运算,不符合条件的返回NULL,而AVG函数会自动忽略NULL值,刚好得到近12个月的平均评分。
  • 用IFNULL处理近12个月无评分的场景,避免返回NULL,ROUND函数控制输出1位小数,匹配前端需要的「4.7星」展示格式。

内容的提问来源于stack exchange,提问作者U-Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:06:03