Mysql 按H2H划分的足球比赛排名表

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

让我开始用一个例子来解释这一点,我有一个包含足球联赛比赛记录的表,通过使用该表及其比赛结果,我能够通过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  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;