2016-04-23 32 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