MySQL:当没有匹配的行时AVG

时间:2015-04-22 18:52:33

标签: mysql null average

我创建了一个网站,用户可以在其中评价从1到5星的商品(比如书)。我创建了一个MySQL数据库和一个存储每个评级信息的表(itemid,userid,ratingValue)。

每个项目都有一个专门的网页,我想在此页面上显示以下信息:(1)评分数量和(2)平均评分。我认为最好用视图完成。在思考要在视图中使用的MySQL查询时,我来到了:

SELECT ItemID, COUNT(ratingValue), IFNULL(AVG(ratingValue),0) FROM reviews GROUP BY ItemID

问题:如果某个项目尚未评级,它将不会出现在查询中。我想要的是所有项目都出现在查询结果(视图)中,如果有一个没有评论的项目,它应该显示有0评论的信息,并且平均评级是某个任意值,让&# 39; s说0。

来自official documentation

  

如果没有匹配的行,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

关于如何克服这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

您必须有另一个表格列出您的所有项目(不考虑他们是否有评论),并将该表格连接到您的reviews表格。如果没有这个,就无法单独从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