3

我在尝试在 football[soccer] 应用程序中应用有关直接比赛的规则时遇到问题。我已经阅读了这篇文章它对根据积分标准、差异和进球数创建站立位置表非常有帮助。

但我想知道是否可以通过直接比赛来排序球队位置:

看这个职位表:

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

正如你所看到的,国际米兰和皇家马德里在积分上打成平手,而国际米兰因为净胜球而领先皇家马德里。我想要得到的结果是这样的:

Pos Team                Pld  W   D   L   F   A   GD  Pts
    1   FC Barcelona    5   2   3   0   8   5   3   9
    2   **Real Madrid** 6   2   2   2   8   8   0   8
    3   *Inter Milan*   6   2   2   2   11  10  1   8
    4   AC Milan        5   0   3   2   8   12  -4  3

请注意,这次皇家马德里队领先于国际米兰,因为它赢得了他们之间的两场直接比赛。

我有一个团队表和其他结果表。

如果可能的话,我想使用 mysql 中的查询来实现这一点。或者,如果我在服务器端(PHP)进行此排序,可能会更好。

感谢任何帮助将不胜感激。

4

2 回答 2

3

不可能在单个查询中有效地执行您请求的操作,该查询将返回您要求的结果使用该标准对关系进行排序。

推理很简单:假设您可以在查询中获得一个列,该列将提供或帮助您想要的排序类型。也就是说,它会根据得分并列的球队来排序,根据哪个球队比其他球队获得更多胜利(因为这很可能发生在超过 2 支球队身上)。要手动进行计算,您需要一个复式表,显示这些球队之间赢得的比赛数量,如下所示:

       | TeamA | TeamB | TeamC
 ------------------------------
 TeamA |     0 |   XAB |   XAC
 TeamB |   XBA |     0 |   XBC
 TeamC |   XCA |   XCB |     0

因此,您只需将每一列行相加,然后按降序排序即可为您提供所需的数据。

问题是,在您真正获得数据之前,您不知道哪些球队是平局的。因此,为一般情况创建该列意味着您需要针对每个团队创建每个团队的整个表(这不是一项小任务);然后您需要将逻辑添加到查询中,仅将团队的列与与它相关的点相加......您需要原始结果集(您应该使用相同的查询创建无论如何)。

有可能在单个查询中获取该信息,但它肯定对数据库来说太重了。您最好在获取您知道需要的数据之后在代码中添加该逻辑(获取 TeamA 与 TeamB 或 TeamC 的比赛数量并不太复杂)。您仍然需要注意如何构建该查询以及运行多少;毕竟,在联赛的前几场比赛中,您将有很多球队相互捆绑,因此获取数据实际上与构建整个复式表相同,我之前以所有球队对阵所有球队为例团队。

于 2012-05-21T22:49:18.107 回答
0

在存储过程中创建临时并调用过程...

create temporary table tab1 (position int not null auto_increment ,
                      team_name varchar(200),
                      points int,
                      goal_pt int,
                      primary key(position));

insert into tab1(team_name, 
                 points,
                 goal_pt) 
    select team_name,
           points,
           goal_pt 
    from team     
    order by points desc,
             goal_pt desc ;
于 2014-12-22T09:39:37.103 回答