2013-10-27 132 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

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