2015-08-05 3 views
2

У меня есть мнение, что постоянно возвращается сообщение об ошибке:MySQL вид возвращает более одной ошибки строки при выполнении

subquery returns more than one row

Я не хорошо с 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 

Все, что я хочу, чтобы получить рейтинги из базы данных с помощью формулы Байеса, которые я погуглить за последние пару часов и я не выигрываю.

Спасибо заранее

+2

Странно, может быть ошибочной ошибкой, а не тем, как внешние значения обычно ссылаются на подзапросы. – Uueerdo

ответ

2

Это сложная ошибка, вызванная тонкой проблемой в запросе. Рассмотрим:

(SELECT count(r.restaurantID) FROM RestaurantReviews) 

Вы думаете, что это делает агрегацию. Однако это не так, потому что r.restaurantId является внешним запросом, поэтому даже count() является внешним запросом. You может исправить это, удалив или отредактировав псевдонимы в подзапросах.

Вместо этого просто напишите правильный запрос агрегации с надлежащим соединением. Запрос будет что-то вроде этого:

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; 

Я не совсем уверен, что вы собираетесь с подзапросов и соединения. Тем не менее, это лучшее место для начала.

+1

Чувак, я куплю тебе кекс однажды, спасибо, что указали это. Это отлично работало – spongyboss