请求编写SQL语句计算每道菜品的平均评分
计算所有菜品的平均评分(含无评分菜品显示0)
数据表结构
dish表
| id | name |
|---|---|
| 1 | pizza |
| 2 | wok |
| 3 | sushi |
约束:id 为主键
rating表
| dish | rate | user |
|---|---|---|
| 1 | 10 | 1 |
| 1 | 4 | 2 |
| 2 | 2 | 1 |
约束:dish 是关联 dish.id 的外键
需求说明
计算每道菜品的平均评分,必须包含所有菜品,无评分的菜品平均评分显示为0,预期结果如下:
| dishID | aver. rate |
|---|---|
| 1 | 7 |
| 2 | 2 |
| 3 | 0 |
解决方案SQL语句
SELECT d.id AS dishID, COALESCE(AVG(r.rate), 0) AS `aver. rate` FROM dish d LEFT JOIN rating r ON d.id = r.dish GROUP BY d.id;
关键逻辑说明
- LEFT JOIN 关联表:以
dish表为主表左连接rating表,确保所有菜品记录都被保留,哪怕该菜品没有任何评分数据。 - AVG() 计算平均值:对分组后的评分计算平均值,无评分的菜品会返回
NULL。 - COALESCE() 替换NULL:将
AVG()返回的NULL替换为0,满足无评分菜品显示0的要求。 - GROUP BY 分组:按菜品
id分组,保证每个菜品仅输出一条平均评分结果。
内容的提问来源于stack exchange,提问作者Dragon
相关产品推荐
相关产品推荐

