2011-02-06 5 views
1

У меня есть инструкция mySQL, которая выглядит ниже. Он пытается выбрать все рестораны (по 1 на каждую строку), концы блюд для каждого ресторана (как может быть 1 или больше кухонь в ресторане) в колонку для каждого ресторана, а также для среднего рейтинга и количества оценок.MySQL: проблема с GROUP_CONCAT, AVG и COUNT

У меня есть три тестовых ресторана. Ресторан 1 имеет 2 типа кухни и 3 оценки. Проблема заключается в том, что количество оценок возвращается вдвое больше фактического значения, а кухни возвращаются как (кухня1 3 раза, а затем кухня2 3 раза), например. (кухня1, кухня1, кухня1, кухня2, кухня2, кухня2). Вы знаете, что может быть причиной этого? Спасибо за любую помощь.

SELECT 
    r.*, 
    GROUP_CONCAT(c.cuisine SEPARATOR ', ') cuisine, 
    ROUND(AVG(re.avg_rating),1) rating, 
    COUNT(re.restaurant_id) num_ratings 
FROM eat_eat_restaurants r 
JOIN eat_eat_restaurant_cuisines_lookup rc ON (r.restaurant_id=rc.restaurant_id) 
JOIN eat_eat_cuisines c ON (rc.cuisine_id=c.cuisine_id) 
LEFT JOIN eat_eat_reviews re ON (r.restaurant_id=re.restaurant_id) 
WHERE r.published=1 
GROUP BY r.restaurant_id 
+0

Это будет несколько матчей в одной из таблиц, в результате чего дублирование, помните, что соединения генерируют кросс-продукт. Либо это, либо ваша GROUP BY нуждается в большем количестве контента. Попробуйте изменить 'r. *' На 'r.restaurant_id' и посмотреть, не исчезла ли проблема. – Orbling

ответ

1

GROUP BY группирует результаты, а не таблицы отдельно.

В вашем случае, если вы хотите

  1. Информационный ресторан.
  2. Кухни.
  3. Рейтинги.

С «кухни» и «оценки» не зависят друг с другом, один из них должны быть сгруппированы по себе:

SELECT 
    r.*, 
    GROUP_CONCAT(c.cuisine SEPARATOR ', ') cuisine, 
    reg.rating, 
    reg.num_ratings 
FROM eat_eat_restaurants r 
    JOIN eat_eat_restaurant_cuisines_lookup rc ON r.restaurant_id=rc.restaurant_id 
    JOIN eat_eat_cuisines c ON rc.cuisine_id=c.cuisine_id 
    LEFT JOIN (
     SELECT re.restaurant_id, 
      ROUND(AVG(re.avg_rating),1) rating, 
      COUNT(re.restaurant_id) num_ratings 
     FROM eat_eat_reviews re 
     GROUP BY re.restaurant_id 
    ) reg ON r.restaurant_id=reg.restaurant_id 
WHERE r.published=1 
GROUP BY r.restaurant_id 
+0

Спасибо за помощь! Он отлично работает! Я очень благодарен – Martin