通过直接比赛订购排名足球[足球]位置

时间:2012-05-21 22:21:53

标签: php mysql sql

我在尝试在足球[足球]应用中应用有关直接比赛的规则时遇到问题。我已经阅读了这个tread,并且通过积分标准,差异和得分目标来创建站立位置表是非常有益的。

但我想知道是否可以通过直接比赛订购球队的位置:

看看这个位置表:

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)进行此排序会更好。

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

2 个答案:

答案 0 :(得分:3)

无法有效在单个查询中执行您请求的内容,该查询将返回您要求按照该条件对点数进行排序的结果。

推理很简单:假设您可以在查询中获得一列,以提供或帮助您进行所需的排序。也就是说,它会命令那些与其他人相比更胜一筹的球队(因为这很可能发生在2支以上的球队)。要手动进行计算,您需要一个双项表,显示这些团队之间的比赛数量,如下所示:

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

因此,您只需添加每个列行,并按降序排序将为您提供所需的数据。

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

有可能在单个查询中获取该信息,但在数据库上肯定会过于沉重。最好在代码中添加该逻辑,然后获取您需要的数据(获得TeamA对TeamB或TeamC赢得的游戏数量并不太复杂)。您仍然需要注意如何构建查询以及运行的数量;毕竟,在联盟的前几场比赛中,你会有很多球队相互捆绑,所以获得数据实际上与构建我之前作为一个例子的所有球队对抗所有球队的整个复选表有效相同队。

答案 1 :(得分: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 ;