我有一个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
答案 0 :(得分:1)
GROUP BY
对结果进行分组,而不是单独分组。
在你的情况下你想要
由于“美食”和“评级”并不相互依赖,其中一个需要自行分组:
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