MySQL:GROUP_CONCAT,AVG和COUNT的问题

时间:2011-02-06 00:36:30

标签: mysql

我有一个mySQL语句,如下所示。它试图选择所有餐厅(每排1个),将每个餐厅的菜肴(每个餐厅可能有一个或多个菜肴)连成每个餐厅的一列,同样的平均评级和评级数。

我已经设置了3家测试餐厅。 Restaurant 1餐厅提供2种菜肴和3种评级。问题是收视率的数量是实际价值的两倍,菜肴的回报为(菜肴1次,然后是菜肴2次),例如: (cuisine1,cuisine1,cuisine1,cuisine2,cuisine2,cuisine2)。你知道这可能导致什么吗?谢谢你的帮助。

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

1 个答案:

答案 0 :(得分:1)

GROUP BY对结果进行分组,而不是单独分组。

在你的情况下你想要

  1. 餐厅信息。
  2. 美食。
  3. 评分。
  4. 由于“美食”和“评级”并不相互依赖,其中一个需要自行分组:

    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