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.
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
我正在创建一个网站,用户可以在其中对项目(比如书籍)进行评分,评分范围为 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.
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