2011-02-06 104 views
1

我有一个如下所示的mySQL语句。它试图选择所有餐厅(每行1个),将每个餐厅的美食(每个餐厅可能有1个或更多的美食)连接到每个餐厅的列中,并且同样对于平均评级和评级数量。MySQL:与GROUP_CONCAT,AVG和COUNT有关的问题

我已经设置了3个测试餐厅。餐厅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