2015-08-05 1 views
2

J'ai une vue qui revient sans cesse cette erreur:vue MySQL retourne plus d'une erreur de ligne lors de l'exécution

subquery returns more than one row

Je ne suis pas bon avec sql et je cherche l'explication d'un profane pourquoi ce qui se passe et comment Je peux le résoudre. Mon code est ci-dessous:

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 

Tout ce que je veux est de récupérer les évaluations de la base de données en utilisant la formule bayésienne que j'ai été googler pour les deux dernières heures et je ne suis pas en train de gagner.

Nous vous remercions à l'avance

+2

Étrange, peut être une erreur trompeuse, ce n'est pas comment les valeurs externes sont généralement référencées dans les sous-requêtes. – Uueerdo

Répondre

2

Ceci est une erreur délicate, provoquée par un problème subtil dans votre requête. Considérez:

(SELECT count(r.restaurantID) FROM RestaurantReviews) 

Vous pensez que cela fait une agrégation. Cependant, ce n'est pas le cas, car provient de la requête externe, donc même le count() provient de la requête externe. Vous pouvez résoudre ce problème en supprimant ou en ajustant les alias dans les sous-requêtes.

Au lieu de cela, écrivez simplement une requête d'agrégation correcte avec une jointure appropriée. La requête serait quelque chose comme ceci:

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; 

Je ne suis pas sûr de ce que vous avez l'intention avec les sous-requêtes et la jointure. Ce qui précède est un meilleur endroit pour commencer, cependant.

+1

Mec, je t'achète un petit gâteau un jour, merci d'avoir signalé ça. Cela a fonctionné parfaitement l'homme – spongyboss