MySQL:没有匹配行时的平均值
我正在创建一个网站,用户可以对物品(比如书籍)进行评级,从1星到5星不等。我创建了一个MySQL数据库和一个表,其中存储了关于每个评级的信息(itemid、userid、ratingValue) 每个项目都有一个专门的网页,我想在这个页面上放一些信息:(1)评分数和(2)平均评分。我认为这是最好的一种观点。考虑到要在视图中使用的MySQL查询,我得出以下结论:MySQL:没有匹配行时的平均值,mysql,null,average,Mysql,Null,Average,我正在创建一个网站,用户可以对物品(比如书籍)进行评级,从1星到5星不等。我创建了一个MySQL数据库和一个表,其中存储了关于每个评级的信息(itemid、userid、ratingValue) 每个项目都有一个专门的网页,我想在这个页面上放一些信息:(1)评分数和(2)平均评分。我认为这是最好的一种观点。考虑到要在视图中使用的MySQL查询,我得出以下结论: 根据ItemID从评论组中选择ItemID、COUNT(ratingValue)、IFNULL(AVG(ratingValue)、0 问
根据ItemID从评论组中选择ItemID、COUNT(ratingValue)、IFNULL(AVG(ratingValue)、0
问题:如果某个项目尚未评级,它将不会出现在查询中。我想要的是,所有项目都出现在查询结果(视图)中,如果有一个项目没有评论,它应该显示有0个评论的信息,并且平均评分是一些任意值,比如0
从
如果没有匹配的行,AVG()将返回NULL
出于这个原因,我尝试使用IFNULL()函数。但是,它不起作用。例如,在包含项目1、2、3、4、5的数据库中,如果项目5没有评论,我将得到:
ItemID COUNT(Rating) IFNULL(AVG(ratingValue),0)
1 4 4.0000
2 2 4.0000
3 2 3.5000
4 3 5.0000
ItemID计数(额定值)如果为空(平均值(额定值),则为0)
1 4 4.0000
2 2 4.0000
3 2 3.5000
4 3 5.0000
关于如何克服这个问题,您有什么想法吗?您必须有另一个表列出您的所有项目(不管它们是否有评论),然后将该表左键连接到您的评论
表。没有这一点,就无法仅从reviews
表中推断出哪些项目可能存在,而这些项目没有审查
比如:
SELECT
i.itemID AS itemID,
COUNT(r.rating) AS ratingCount,
AVG(ratingValue) AS averageRating
FROM items AS i
LEFT JOIN reviews AS r
ON i.itemID = r.itemID
GROUP BY i.itemID
这将产生如下结果:
ItemID ratingCount averageRating
1 4 4.0000
2 2 4.0000
3 2 3.5000
4 3 5.0000
5 0 NULL
成功了!我从未想过使用左连接,但这确实是一个很好的解决方案。