让我以一个示例开始进行解释,我有一个表,该表记录了一个足球联赛中比赛的记录,通过使用该表及其比赛结果,可以通过mysql为该联赛中的球队生成一个积分榜查询。
表[匹配项](示例)
--------------------------------------------------------
|id | hometeam |goalsfor|goalsagainst| awayteam |
--------------------------------------------------------
--------------------------------------------------------
| 8 | Real Madrid | 2 | 0 | Inter Milan |
--------------------------------------------------------
| 9 | Inter Milan | 3 | 3 | Real Madrid |
--------------------------------------------------------
通过查询生成的排名
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
查询:
select
team,
count(*) played,
count(case when goalsfor > goalsagainst then 1 end) wins,
count(case when goalsagainst> goalsfor then 1 end) lost,
count(case when goalsfor = goalsagainst then 1 end) draws,
sum(goalsfor) goalsfor,
sum(goalsagainst) goalsagainst,
sum(goalsfor) - sum(goalsagainst) goal_diff,
sum(
case when goalsfor > goalsagainst then 3 else 0 end
+ case when goalsfor = goalsagainst then 1 else 0 end
) score
from (
select hometeam team, goalsfor, goalsagainst from scores
union all
select awayteam, goalsagainst, goalsfor from scores
) a
group by team
order by score desc, goal_diff desc;
我要做的是根据头对头比赛对排名进行排序,因此首先要按点数排序,然后如果有平局,第二种排序方式是两支球队进行比赛并比较谁获得了更多胜利或得分更高,然后使用该得分对表进行排序。
通过这样做,例如皇家马德里将排名第二,然后国际米兰排名第三。
我该如何实现? 我想比较两支球队的得分相等时的比赛情况,并以此来进行排序。
ORDER BY score DESC, h2h DESC; goal_diff DESC
更新:我结束了sql和php的混合解决方案,首先我找到了排名相等的团队,然后为这些团队赢得了迷你H2H排名,并根据该排名更新了排名。我仍然认为仅使用sql就能做到这一点,但是由于我的查询繁琐而又难以使用sql来实现,这就是为什么我在实现中混入了php。
答案 0 :(得分:1)
您需要分两个步骤进行处理。首先,运行上面的查询并将结果存储在工作表中(在下面称为工作表)。然后,您需要为每个得分相同的团队获得决胜局得分。下面,我将比赛表加入每个团队的工作表,并忽略工作行得分不同的地方,因为它们并不重要。如果获胜,则给团队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;