2011-02-06 6 views
1

次のようなmySQL文があります。すべてのレストラン(1列に1つ)を選択し、各レストランの料理を各レストランの列に連結し(1つのレストランにつき1つ以上の料理がある場合があるため)、各レストランの列に、同様に平均格付けおよび格付け数を試みます。MySQL:GROUP_CONCAT、AVG、COUNTの問題

私は3つのテストレストランを設定しました。レストラン1には2種類の料理と3種類の料理があります。問題は、評価の数が実際の値の2倍を返し、料理が(料理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