您必须实现一些MySQL变量来帮助更有效地处理这个问题,而不是多个查询/加入/分组.这只有一次通过所有记录,然后再次获得每种类型的赢/输(或平局)的最大值.我假设您提供的数据是一次性的,而日期是游戏的明显顺序……积分是您感兴趣的团队,并且反对的是对手是谁.也就是说,我的“别名”名称将是“YourResultSingleTeam”.
内部查询将预先确定游戏的状态为“W”或“L”oss.然后,查看该值是否与团队的上一个实例相同.如果是,请将1添加到现有的赢/输计数器中.如果没有,请将计数器设置回1.然后,将当前游戏的状态恢复为“LastStatus”值,以便与下一个游戏进行比较.
完成后,它是一个简单的游戏结果,max()按游戏结果状态分组
select
StreakSet.GameResult,
MAX( StreakSet.WinLossStreak ) as MaxStreak
from
( select YR.Date,
@CurStatus := if( YR.PointsFor > YR.PointsAgainst, 'W', 'L' ) as GameResult,
@WinLossSeq := if( @CurStatus = @LastStatus, @WinLossSeq +1, 1 ) as WinLossStreak,
@LastStatus := @CurStatus as carryOverForNextRecord
from
YourResultSingleTeam YR,
( select @CurStatus := '',
@LastStatus := '',
@WinLossSeq := 0 ) sqlvars
order by
YR.Date ) StreakSet
group by
StreakSet.GameResult
正如Nikola所提出的,如果你想考虑“平局”游戏,我们可以通过将@CurStatus更改为案例/条件来调整
@CurStatus := case when YR.PointsFor > YR.PointsAgainst then 'W'
when YR.PointsFor < YR.PointsAgainst then 'L'
else 'T' end as GameResult,