2011-02-06 142 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