Mysql 按H2H划分的足球比赛排名表
让我开始用一个例子来解释这一点,我有一个包含足球联赛比赛记录的表,通过使用该表及其比赛结果,我能够通过mysql查询生成该联赛球队的排名表 表[匹配项](示例) 按查询生成的排名Mysql 按H2H划分的足球比赛排名表,mysql,sql,sorting,sql-order-by,Mysql,Sql,Sorting,Sql Order By,让我开始用一个例子来解释这一点,我有一个包含足球联赛比赛记录的表,通过使用该表及其比赛结果,我能够通过mysql查询生成该联赛球队的排名表 表[匹配项](示例) 按查询生成的排名 Pos Team Pld W D L F A GD Pts 1 FC Barcelona 5 2 3 0 8 5 3 9 2 Inter Milan 6 2 2 2 11 10
Pos Team Pld W D L F A GD Pts
1 FC Barcelona 5 2 3 0 8 5 3 9
2 Inter Milan 6 2 2 2 11 10 1 8
3 Real Madrid 6 2 2 2 8 8 0 8
4 AC Milan 5 0 3 2 8 12 -4 3
查询:
我想做的是根据头对头的比赛来排序排名,因此首先按分数排序,然后如果有平局分数,第二个排序将是查看两个队的比赛,比较谁赢得更多,或得分更多,然后使用该排序表来排序
通过这样做,皇家马德里将排名第二,国际米兰将排名第三
我怎样才能做到这一点?
我想比较两队得分相等时的比赛,并用它们来排序
ORDER BY score DESC, h2h DESC; goal_diff DESC
更新:我最后使用了sql和php的混合解决方案,首先我找到排名相等的团队,然后为这些团队生成迷你h2h排名,并根据它更新排名。我仍然认为仅使用sql是可行的,但由于我的繁重查询太复杂,无法仅使用sql实现,这就是为什么我在实现中混合使用php的原因
您需要分两个步骤来处理此问题。首先,运行上面的查询并将结果存储在工作表中(在下面称之为工作)。然后,你需要为每个得分相同的球队获得一个平局得分。下面,我将matches表连接到每个团队的work表,并忽略任何工作行分数不相同的地方,因为它们并不重要。如果他们赢了,就给他们1分。我必须为另一方再做一次。你可能想把这个改成3胜1平 将这些结果相加,将结果加入到工作中的团队行中,在得分相同的每一行中都有一个平局得分 你需要检查如果你有很多球队在同一个分数上会发生什么,看看这是否是你想要的结果
select w.*, b.hth
From work w
left outer join (
select team, SUM(hth) hth
from (
Select hometeam team, case when m.goalsfor > m.goalsagainst then 1 else 0 end hth
from matches m
inner join work w1 on m.hometeam = w1.team
inner join work w2 on m.awayteam = w2.team
where w1.score = w2.score
union all
Select awayteam team, case when m.goalsAgainst > m.goalsFor then 1 else 0 end hth
from matches m
inner join work w1 on m.hometeam = w1.team
inner join work w2 on m.awayteam = w2.team
where w1.score = w2.score
) a --all hth at same points
group by team
) b --summed to one row per team
on b.team = w.team
order by w.score desc, b.hth desc;
ORDER BY score DESC, h2h DESC; goal_diff DESC
select w.*, b.hth
From work w
left outer join (
select team, SUM(hth) hth
from (
Select hometeam team, case when m.goalsfor > m.goalsagainst then 1 else 0 end hth
from matches m
inner join work w1 on m.hometeam = w1.team
inner join work w2 on m.awayteam = w2.team
where w1.score = w2.score
union all
Select awayteam team, case when m.goalsAgainst > m.goalsFor then 1 else 0 end hth
from matches m
inner join work w1 on m.hometeam = w1.team
inner join work w2 on m.awayteam = w2.team
where w1.score = w2.score
) a --all hth at same points
group by team
) b --summed to one row per team
on b.team = w.team
order by w.score desc, b.hth desc;