MySQL视图在执行时返回多行错误

时间:2015-08-05 19:28:05

标签: mysql statistics average rating

我有一个不断返回此错误的视图:

  

子查询返回多行

我对sql并不擅长,我正在寻找一个外行人解释为什么会发生这种情况以及如何解决它。我的代码如下:

Create View `RestaurantRatings` AS    
    SELECT
        p.restaurantName,
    (SELECT count(r.restaurantID) FROM RestaurantReviews) / (SELECT count(DISTINCT r.restaurantID) FROM RestaurantReviews) AS avg_num_votes,
    (SELECT avg(r.rating) FROM RestaurantReviews) AS avg_rating,
    count(r.restaurantID) as num_votes,
    avg(r.rating) as rating
FROM
    Restaurants p,
    RestaurantReviews r
where
     p.restaurantID = r.restaurantID
GROUP BY 
    restaurantName

我想要的只是使用贝叶斯公式从数据库中检索评级,我在过去几个小时里一直在谷歌搜索,而且我没有赢。

提前谢谢

1 个答案:

答案 0 :(得分:2)

这是一个棘手的错误,由查询中的细微问题引起。考虑:

(SELECT count(r.restaurantID) FROM RestaurantReviews) 

您认为这是在进行聚合。但是,它不是,因为r.restaurantId来自外部查询,所以即使count()来自外部查询。您可以通过删除或调整子查询中的别名来 来解决此问题。

相反,只需使用正确的连接编写正确的聚合查询。查询将是这样的:

Create View `RestaurantRatings` AS    
    SELECT p.restaurantName,
           count(r.restaurantID) / count(DISTINCT r.restaurantID) AS avg_num_votes,
           avg(r.rating) AS avg_rating,
           count(r.restaurantID) as num_votes,
    FROM Restaurants p left join
         RestaurantReviews r
         on p.restaurantID = r.restaurantID
    GROUP BY  restaurantName;

我不完全确定您对子查询连接的意图。不过,上面是一个更好的起点。