2012-02-24 5 views
1

私は2つのSQLのテーブルがあります。SQLクエリ - 評価の高いアイテムを取得するには?

item 
id name price 
1 name1 100 
2 name2 100 
3 name3 100 
4 name4 100 

rates 
id item_id rating 
1 1  5 
2 4  4 
3 2  5 
4 2  3 
5 3  1 
... 

をそして、私は最高の平均格付けとの3つの項目を表示したいです。私はどうしたらいいですか?

私はそのような平均的な項目の評価を得る:

$item = mysql_query("SELECT * FROM item"); 
while($row = mysql_fetch_assoc($item)) { 
    $id = $row['id']; 
    $rate= mysql_query("SELECT AVG(rating) FROM rates WHERE id= $id"); 
} 

答えて

4

あなたは派生テーブルで最高の平均値を計算し、それに参加することができます:

select i.id, i.name, i.price 
from item i 
join (
    select id, avg(rating) as ar 
    from rates 
    group by id 
    order by ar desc, id 
    limit 3 
) dt on i.id = dt.id; 

私はあなたが重複を持っている場合に一貫性のある結果を強制するORDER BYにidを追加しました。

1
$item = mysql_query("SELECT i.*, (SELECT AVG(`rating`) FROM `rates` WHERE `item_id` = i.`id`) AS `rating` FROM `item` i ORDER BY `rating` DESC LIMIT 3"); 

あなたがそうのようなサブクエリを実行しようとしたことがありますか?これを行うには、これが最も効率的で正確な方法ではないと思いますが、役に立つと思う基本的な結果が得られるかもしれません。

ゲーミング(標準偏差の外れ値)を排除し、アイテムごとに一定の平均値を保持するのが理想的ですが、バックエンドでこれを処理するのが理想的ですが、必要以上に複雑かもしれません。

関連する問題