2013-10-27 97 views
0

首先,我会提醒大家,我是MySQL的新手。另外我还没有测试下面的示例查询,所以它们可能不完美。MySQL - 获取行和行的平均值

无论如何,我有一个项目表,每个项目都有一个名称,一个类别和一个分数。每12小时将顶级项目拿走,使用然后移除。

到目前为止,我只是抓住了顶部的项目与

SELECT * FROM items_table ORDER BY score DESC LIMIT 1 

与此唯一的问题是,有些类别的偏见和具有普遍较高的分数。我想通过将得分除以平均得分来排序来解决这个问题,而不是仅仅通过得分来排序。类似于

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

我正在尝试找出找到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 

什么我不知道,如果是有一些方法来检索均线正好在一个查询。

感谢,

YM

+0

“我与MySQL新秀的东西”你这是什么意思新秀? – Imran

+1

@imran:https://www.google.co.uk/search?q=define%3Arookie – eggyal

+0

我已经使用它约3年,但我是自学成才,并且只在大约6个月前了解了规范化数据库。 –

回答

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 
+0

看起来很完美,我会在几个小时内用自己的代码对它进行测试。 –

+0

不只是看起来很完美,工作也很完美。非常感谢你! –