MySQL表加入AVG()
问题描述:
我有一个“收视率”表,它包含(作为外键)它评级的东西的ID。可能有多个评级,或者没有评级。MySQL表加入AVG()
我想加入表格以查看所有不同ID的不同评分,但现在我无法查看没有评分的事物。例如:
mysql> select avg(ratings.rating), thing.id from ratings, things where ratings.thingId = thing.id group by thing.id;
+----------------------+----+
| avg(ratings.rating) | id |
+----------------------+----+
| 6.3333 | 1 |
| 6.0000 | 2 |
+----------------------+----+
有什么方法可以修改我的选择查询以包含没有评分的ID吗?我试着修改陈述where ratings.thingId = thing.id or thing.id > 0
但这似乎没有帮助。
谢谢并抱歉,如果它不清楚。
答
SELECT AVG(ratings.rating),
thing.id
FROM things
LEFT OUTER JOIN ratings
ON ratings.thingId = things.id
GROUP BY thing.id
答
您目前正在执行内部联接,从而消除things
记录没有关联ratings
。相反,OUTER JOIN ...
SELECT AVG(COALESCE(ratings.rating, 0)), thing.id
FROM things
LEFT JOIN ratings ON things.id = ratings.thingId
GROUP BY thing.id
将返回所有things
,无论他们是否拥有ratings
。请注意使用COALESCE()
,它将返回第一个非NULL参数 - 因此things
而没有ratings
将返回0作为它们的平均值。
+0
感谢您的解释 - 在我的书中还没有得到那么多,真的想知道如何解决这个问题! – JDelonge 2011-02-08 20:21:10
答
SELECT p.id,p.title,(选择轮(AVG(pr.rating),1) 从post_rating PR 其中pr.postid = p.id)作为AVG FROM posts
p
当我通过things.id添加组,这起作用 - 谢谢! – JDelonge 2011-02-08 20:08:27