2011-02-08 38 views
3

我有一个“收视率”表,它包含(作为外键)它评级的东西的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但这似乎没有帮助。

谢谢并抱歉,如果它不清楚。

回答

8
SELECT AVG(ratings.rating), 
     thing.id 
    FROM things 
     LEFT OUTER JOIN ratings 
      ON ratings.thingId = things.id 
    GROUP BY thing.id 
+0

当我通过things.id添加组,这起作用 - 谢谢! – JDelonge 2011-02-08 20:08:27

4

您目前正在执行内部联接,从而消除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

-1

SELECT p.id,p.title,(选择轮(AVG(pr.rating),1) 从post_rating PR 其中pr.postid = p.id)作为AVG FROM posts p