MySQL:没有匹配行时的AVG

MySQL: AVG when there are no matching rows

我正在创建一个网站,用户可以在其中对项目(比如书籍)进行评分,评分范围为 1 到 5 星。我创建了一个 MySQL 数据库和一个 table 来存储关于每个评级的信息(itemid、userid、ratingValue)。

每个项目都有一个专门的网页,我想在此页面上放置以下信息:(1) 评分数和 (2) 平均评分。我认为最好通过视图来完成。在考虑在视图中使用 MySQL 查询时,我得出:

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

问题:如果一个项目还没有被评级,它就不会出现在查询中。我想要的是所有项目都出现在查询结果(视图)中,如果有一个项目没有评论,它应该显示有 0 条评论的信息,并且平均评级是某个任意值,比方说0.

来自official documentation

AVG() returns NULL if there were no matching rows

因此,我尝试使用 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

关于如何克服这个问题有什么想法吗?

你必须有另一个 table 列出你的所有项目(不管他们是否有评论)并离开 table 加入你的 reviews table.否则,无法仅从 reviews table 推断出哪些项目可能存在没有评论。

所以像这样:

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