商品の評価を表す評価があります。
これらのレーティングは、値(1〜5の整数)、product_idおよびrating_type_idを持ちます。Complex MySQL-Query:オブジェクトの名前、すべての孫の数と平均値を取得します。
レーティングはrating_typesと多対1の関係にあります。 rating_typesには、rating_categoriesに対するmany_to_oneの関係があります。意味:one rating_category
はseveral rating_types
、one rating_types
はseveral 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}
パフォーマンスは本当に悪くありませんか?あなたは結合を使うべきでしょうか? –
パフォーマンスは、dbエンジンの改良で進化するdbオプティマイザと同じくらい良いでしょう。すべてのテーブルのプライマリキーにインデックスがある場合、グループ化は遅くなりません。さらに、http://dev.mysql.com/doc/refman/5.0/en/explain.htmlを説明してパフォーマンスをチェックすることもできます。 – too