如何从足球[足球]结果的mysql表中动态输出积分榜?

2022-08-31 00:54:15

我一直试图找到有关此主题的东西,但我似乎找不到任何东西,这里有一些问题,但它们不适用于我的特定项目。

我问了一个关于更新表格的类似问题,但它不适用于我真正想要的结果是结果列表。

 --------------------------------------------------------
|id  |   hometeam   |goalsfor|goalsagainst|   awayteam   |
 --------------------------------------------------------
| 1  |Inter Milan   |   3    |     1      | FC Barcelona |
 --------------------------------------------------------
| 2  |FC Barcelona  |   1    |     0      | Inter Milan  |
 --------------------------------------------------------
| 3  |Inter Milan   |   4    |     0      | AC Milan     |
 --------------------------------------------------------
| 4  |AC Milan      |   0    |     2      | Inter Milan  |
 --------------------------------------------------------
| 5  |Real Madrid   |   2    |     0      | AC Milan     |
 --------------------------------------------------------
| 6  |AC Milan      |   2    |     2      | Real Madrid  |
 --------------------------------------------------------
| 7  |FC Barcelona  |   2    |     2      | AC Milan     |
 --------------------------------------------------------
| 8  |Real Madrid   |   2    |     0      | Inter Milan  |
 --------------------------------------------------------
| 9  |Inter Milan   |   3    |     1      | Real Madrid  |
 --------------------------------------------------------
| 10 |FC Barcelona  |   2    |     0      | Real Madrid  |
 --------------------------------------------------------
| 11 |Real Madrid   |   1    |     1      | FC Barcelona |
 --------------------------------------------------------

基本上,我希望能够创建一个排名表,按顺序对球队进行排名,我想动态呈现此表,而不是将其放入数据库中

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=位置 W=赢 D=平局 L=失利 F=A=进球数=对阵GD的进球数=净胜球点数=分数

我认为最有效的方法是分配胜利,平局和失利,将进球和进球相加,并在回显数据时 - 计算比赛总数和得分。

但是,我如何分配赢平局或输家呢?并计算进球数和进球数?


答案 1

首先将比分表合并在一起,将主队与客队交换并交换进球数。这为您提供了一些易于聚合的源数据,并且生成记分卡的查询如下所示:

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;

答案 2
// connection stuff
$sql = 'select * from matchesTable';
$result = mysql_query($sql)

$standings = array ();
$standingTemplate = array ('matches' => 0, 'wins' => 0, 'draws' => 0, 'losses' => 0, 'goalsfor' => 0, 'goalsagainst' => 0, 'goalsdiff' => 0, 'points' => 0);

while ($row = mysql_fetch_assoc($result)) 
{
    handleMatch($row['hometeam'], $row['goalsfor'], $row['goalsagainst']);
    handleMatch($row['awayteam'], $row['goalsfor'], $row['goalsagainst']);

    print_r( usort(standings, 'comparePoints') );  // up to you to format the output as you like
}

function handleMatch($team, $goalsfor, $goalsagainst)
{
    global $standings, $standingTemplate;
    if ($goalsfor > $goalsagainst) 
    {
        $points = 3;
        $win = 1;
        $draw = 0;
        $loss = 0;
    }
    elsif ($goalsfor == $goalsagainst) 
    {
        $points = 1;
        $win = 0;
        $draw = 1;
        $loss = 0;
    }
    else 
    {
        $points = 0
        $win = 0;
        $draw = 0;
        $loss = 1;
    }

    if ( empty($standings[$team]) )$standing = $standingTemplate;
    else $standing = $standings[$team];

    $standing['matches']++;
    $standing['wins'] += $win;
    $standing['draws'] += $draw;
    $standing['losses'] += $loss;
    $standing['goalsfor'] += $goalsfor;
    $standing['goalsagainst'] += $goalsagainst;
    $standing['goalsdiff'] += $goalsfor - $goalsagainst;
    $standing['points'] += $points;

    $standings[$team] = $standing;

}

function comparePoints($a, $b)
{
    if ($a['points'] == $b['points']) 
    {
        if ($a['goalsdiff'] == $b['goalsdiff']) return 0;
        return ($a['goalsdiff'] < $b['goalsdiff']) ? 1 : -1 ;
    }       
    return ($a['points'] < $b['points']) ? 1 : -1 ;
}

注意:我没有测试它,所有,可能是小错误(一些或缺失)。$;


推荐