2

写真の評価用のDBテーブルがあり、最も評価の高い写真を取得したいと考えています。最高から最低にソートされた評価の平均に基づいてこれを行う必要があることを私は知っています。DBテーブルは次のようになります。

id  rating  rated_photo_id 
--  ------  ------------- 
1   5       1       
2   6       1
3   3       2
4   4       1
5   7       2

SQLクエリでこの計算を実行することは効率的ですか、それとも可能ですか?そうでない場合は、各photo_idの平均を格納する2番目のテーブルを維持することは理にかなっていますか?

4

4 に答える 4

3

これは、ほとんどすべてのデータベースで可能です。MySQLの集約関数を確認してください。

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

具体的には、 http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_avgで質問してください。

于 2013-01-07T21:21:47.157 に答える
2

はい、rated_photo_id列にインデックスがあると仮定すると、平均を計算するのは簡単で効率的です。

 select rated_photo_id, AVG(rating) as average_rating 
       from photos group by rated_photo_id order by average_rating desc

特定の写真については、IDを指定できます。

 select rated_photo_id, AVG(rating) 
     from photos where rated_photo_id = 2 group by rated_photo_id 

理想的には、インデックスが(rated_photo_id、rating)これらのクエリをカバーするようになり、実行が最速になります。

于 2013-01-07T21:22:36.333 に答える
2

2番目のテーブルは必要ありません。評価表には、必要な情報が含まれています。MySQL集計関数をGROUP BY次のコマンドで使用します。

SELECT rated_photo_id, AVG(rating) AS AverageRating, COUNT(*) AS NumberOfRatings
FROM rating_table
GROUP BY rated_photo_id
ORDER BY AverageRating DESC

出力:

+----------------+---------------+-----------------+
| rated_photo_id | AverageRating | NumberOfRatings |
+----------------+---------------+-----------------+
|              1 |        5.0000 |               3 |
|              2 |        5.0000 |               2 |
+----------------+---------------+-----------------+
于 2013-01-07T21:23:17.250 に答える
1

写真IDでグループ化するだけで、グループが作成されたときの平均を取得できるはずです。

SELECT rated_photo_id , AVG(rating) as rating
FROM photos 
GROUP BY rated_photo_id
ORDER BY rating DESC
于 2013-01-07T21:23:10.277 に答える