2016-04-23 100 views
0

因此我搜索並發現了很多類似於我的問題,例如 MYSQL - get a row for each year, with total sum for each month但我正在尋找不同的方式。我使用拉曼數據庫,每年都會通過WAR查找前十名玩家。然後,我將這些球員的年齡平均分配給該賽季的平均年齡。我試圖每年都這樣做,但我堅持如何做到這一點。獲取顯示每年發現的平均值的行列表MYSQL

SELECT AVG(t.age) As AverageAge, w.yearID 
    FROM (SELECT w.playerID, w.age 
    From war_batting w, Master m 
    WHERE w.playerID = m.playerID AND w.yearID = 2012 
    ORDER by w.WAR desc 
    LIMIT 10) t, 
war_batting w; 

這顯示了該賽季前10名球員的平均水平,所以我期待着在每個賽季都這樣做。在我鏈接到的帖子中,我看到他們會爲他們需要的每個價值做到這一點,但我正在尋找一種不涉及重複相同代碼近150年的方式。我已經在Java和C++中編程,所以很自然地,我正在尋找一種方法來循環使用我所擁有的功能,並且在當前年份之前不斷添加1到年份ID。我很難理解如何做到這一點。上面的代碼還將2004年的yearID返回爲2004年,而不是2012年,但我更有信心解決這個問題,因爲我很確定自己在其他測試中有這種能力。此外,如果代碼塊不能很好地發佈時,我會嘗試修復它,因爲這是我的第一篇文章。

回答

0

你不能從master表中選擇任何東西,所以沒有必要加入吧..

嘗試下面的查詢。它有一個內部查詢,它使用用戶定義的變量根據WAR降序進行排名。然後,外層查詢只查看< = 10的排名,然後按yearID進行分組時平均。

SELECT AVG(T.age) AS AverageAge, T.yearID 
FROM 
    (SELECT w.playerID, w.age, w.yearID, 
     CASE WHEN @prev_year = yearID THEN @rank := @rank+1 
     ELSE @rank:=1 
     END as rank, 
     @prev_year := yearID 
    FROM war_batting w 
    ORDER BY yearID ASC, WAR DESC 
    )T 
WHERE T.rank <= 10 
GROUP BY T.yearID 

sqlfiddle

這樣就可以只添加ORDER BY T.yearID DESCORDER BY T.yearID ASC到您的查詢的末尾,讓所有的結果,而不執行相同的代碼,每年爲150年。

+0

主人是從一個不同的代碼遺留下來的,但是我不需要那個。至於你的樣本,它經歷了幾年,但每年的平均年齡值都是不正確的。我不知道爲什麼,但我會看看我是否可以使用它來獲得我需要的東西。 – ATV360

+0

我真的不知道爲什麼,但是當我在測試中的where語句中刪除w.playerID = m.playerID時,發現這些值只有一年,它只返回1號玩家的年齡。在這個顯示前十名球員的情況下,它也將只顯示他10次。 – ATV360

+0

我只是試着將這個語句和主表添加回你的程序,現在它完美地工作。我仍然不完全確定它爲什麼這樣工作,但非常感謝你的幫助! – ATV360