0

First of all I'll just warn everyone that I'm something of a rookie with MySQL. Additionally I haven't tested the example queries below so they might not be perfect.

Anyway, I have a table of items, each one with a name, a category and a score. Every 12 hours the top item is taken, used and then removed.

So far I've simply been grabbing the top item with

SELECT * FROM items_table ORDER BY score DESC LIMIT 1

The only issue with this is that some categories are biased and have generally higher scores. I'd like to solve this by sorting by the score divided by the average score instead of simply sorting by the score. Something like

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

I'm now trying to work out the best way to find averageScore. I have another table for categories so obviously I could add an averageScore column to that and run a cronjob to keep them updated and retrieve them with something like

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

but this feels messy. I know I can find all the averages using something like

SELECT AVG(score) FROM items_table GROUP BY category

What I'm wondering is if there's some way to retrieve the averages right in the one query.

Thanks,

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 回答