2015-04-22 65 views
0

我正在创建一个网站,用户可以从1到5星评价项目(比如说书籍)。我创建了一个MySQL数据库和一个存储关于每个评级(itemid,userid,ratingValue)信息的表格。MySQL:没有匹配行时的AVG

每个项目都有一个专门的网页,我想把这个网页上的信息:(1)收视率和(2)平均评分。我认为这是最好的一个观点。在思考的MySQL查询,在视图中使用,我来:

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

问题:如果一个项目尚未评估,也不会出现在查询。我想要的是所有项目都出现在查询结果(视图)中,如果有没有评论的项目,它应该显示信息有0条评论,并且平均评分是一些任意值,假设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 

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

回答

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 
+0

这工作!我从来没有想过使用LEFT JOIN,但这确实是一个很好的解决方案。 –