0

まず最初に、私は MySQL の初心者であることを皆さんに警告します。さらに、以下のサンプル クエリはテストしていないため、完全ではない可能性があります。

とにかく、項目のテーブルがあり、それぞれに名前、カテゴリ、およびスコアがあります。12 時間ごとに一番上のアイテムが取り出され、使用されてから取り除かれます。

これまでのところ、私は単にトップアイテムをつかんでいます

SELECT * FROM items_table ORDER BY score DESC LIMIT 1

これに関する唯一の問題は、一部のカテゴリに偏りがあり、一般的にスコアが高いことです。単純にスコアでソートするのではなく、平均スコアで割ったスコアでソートすることでこれを解決したいと思います。何かのようなもの

ORDER BY score/(GREATEST(5,averageScore))

私は現在、平均スコアを見つけるための最良の方法を見つけようとしています。カテゴリ用の別のテーブルがあるので、それに averageScore 列を追加し、cronjob を実行してそれらを更新し、次のような方法で取得できます

SELECT * FROM items_table, categories_table WHERE items_table.category = categories_table.category ORDER BY items_table.score/(GREATEST(5,categories_table.averageScore)) DESC LIMIT 1

しかし、これは面倒に感じます。次のようなものを使用してすべての平均を見つけることができることを知っています

SELECT AVG(score) FROM items_table GROUP BY category

私が疑問に思っているのは、1 つのクエリで平均を正しく取得する方法があるかどうかです。

ありがとう、

YM

4

1 に答える 1

1

平均を計算するクエリを結合できます。

SELECT   i.*
FROM     items_table i JOIN (
           SELECT   category, AVG(score) AS averageScore
           FROM     items_table
           GROUP BY category
         ) t USING (category)
ORDER BY i.score/GREATEST(5, t.averageScore) DESC
LIMIT    1
于 2013-10-27T01:33:14.167 に答える