2017-05-14 81 views
-1

我需要計算每玩家的最近3個得分(高爾夫回合)的平均得分。如果它對代碼/語法很重要,那麼只有當它們至少有3個分數時才需要。mysql選擇3個最近的得分,然後平均爲

我有了這些領域的一個觀點:

round_id 
player_id 
score 
round_date 

隨着新的分數輸入到數據庫中,我想跟蹤和通知。我認爲我的選擇將保持在數據庫內(以某種方式)或生成適當的PHP代碼來做等效。但考慮到保持在數據庫本身內部,它可以/更好地處理新的數據插入/更新。 PHP將有一個頁面需要加載才能執行。

我見過嵌套select語句的一些例子,有些具有mysql變量(我基本的sql技巧,並沒有真正進入變量,所以需要解釋)。似乎沒有直接關係到我的具體需求。

由於

+2

這基本上是一個規範。我們在SO不是一個免費的編碼資源。如果你做了一些研究,然後去做,但是沒有把它完全弄清楚,那麼我們非常樂意提供幫助。 – RiggsFolly

+2

請參閱http://stackoverflow.com/questions/2129693/mysql-using-limit-within-group-by-to-get-n-results-per-group瞭解如何獲得前三名的成績。把它放在一個子查詢中,然後在主查詢中使用'AVG()'來得到平均值。 – Barmar

+0

@Barmar find_in_set在這裏並不適用,據我所見 – ysth

回答

0

像這樣(未測試):

select player_id, avg(substring_index(substring_index(scores,',',round),',',-1)) 
from 
(
    select 1 round union all select 2 union all select 3 
) last_rounds 
cross join 
(
    select player_id, group_concat(score order by round_date desc) scores 
    from player_round 
    group by player_id 
    having count(*) >= 3 
) player_scores 
group by player_id 
+0

我是否正確,第三個查詢只查找player_id在哪裏玩過3次?這並不是我特別想找的 - 我只想平均最後3輪,但他們必須打3輪。 –

+0

不,它說3或更多,不超過3.你可以刪除那條線,但是這樣會得到連玩過1或2輪的玩家 – ysth

+0

@jingo_man這樣做對你不合適嗎? – ysth