2010-12-07 7 views
1

商品の評価を表す評価があります。
これらのレーティングは、値(1〜5の整数)、product_idおよびrating_type_idを持ちます。Complex MySQL-Query:オブジェクトの名前、すべての孫の数と平均値を取得します。

レーティングはrating_typesと多対1の関係にあります。 rating_typesには、rating_categoriesに対するmany_to_oneの関係があります。意味:one rating_categoryseveral rating_typesone rating_typesseveral ratingsです。

さらに、すべての製品には、rating_categoriesと多対多の関係があります。つまり、指定された製品は、rating_typeがこれらのrating_categoriesに属する評価によってのみ評価されます。

特定の商品IDについて、すべてのrating_category、カテゴリ名、すべての評価の数、およびすべての評価の平均を検索したいと思います。これらのレーティングはproduct_idを外部キーとして持ち、rating_typeがforeignkeyとしてrating_categoryを持つ外部キーとしてrating_typeを持つ必要があります。

これは、これまでのところ、私のクエリですが、それは間違っている:

SELECT rc.name, rc.rating_category_id, 
(SELECT COUNT(*) as count, AVG(value) as average 
    FROM rating 
    WHERE rating_id IN (
    SELECT r.rating_id 
    FROM rc // I want to reference the same rating_category rc as above 
    LEFT JOIN rating_type rt 
    ON rating_category_id 
    LEFT JOIN rating r 
    ON rating_type_id 
    ) 
) 
FROM rating_category_4_product rc4p 
LEFT JOIN rating_category rc 
ON rating_category_id 
WHERE rc4p.product_id = {$productId} 

答えて

1

これは、しかしテストしていないはずです。

SELECT 
    rc4p.product_id, 
    rc.rating_category_id, 
    rc.name, 
    COUNT(r.rating_id), 
    AVG(r.value) 
FROM 
    rating_category_4_product rc4p, 
    rating_category rc, 
    rating_type rt, 
    rating r 
WHERE 
    r.rating_type_id = rt.rating_type_id 
    AND rt.rating_category_id = rc.rating_category_id 
    AND rc.rating_category_id = rc4p.rating_category_id 
    AND rc4p.product_id = {$productId} 
GROUP BY 
    rc4p.product_id, 
    rc.rating_category_id, 
    rc.name 
+0

パフォーマンスは本当に悪くありませんか?あなたは結合を使うべきでしょうか? –

+0

パフォーマンスは、dbエンジンの改良で進化するdbオプティマイザと同じくらい良いでしょう。すべてのテーブルのプライマリキーにインデックスがある場合、グループ化は遅くなりません。さらに、http://dev.mysql.com/doc/refman/5.0/en/explain.htmlを説明してパフォーマンスをチェックすることもできます。 – too

関連する問題