PHP / MySQL - 基于最后一个db列的排名

时间:2012-01-30 23:35:48

标签: php mysql ranking

我有两张桌子(MySQL):玩家和分数。在分数表中以这种方式存储年度分数:

player_id | 2002 | 2003 | 2004
        1 |  5   |  6   |  4
        2 |  3   |  2   |  5
               Etc.

我编写了以下代码,根据去年的分数进行排名。

$extract = mysql_query("SELECT * FROM players AS p, scores AS s WHERE p.player_id =s.player_id ORDER BY s.2004 desc"); 

while ($row = mysql_fetch_assoc($extract)) { 
    $name = $row['name'];      
    $score = $row['2004']; 

    if ($row['2004'] < $row['2003']) { 
     $value = "-"; 
    } 
    else if ($row['2004'] > $row['2003']) { 
     $value = "+"; 
    }     
    else if ($row['2004'] == $row['2003']) { 
     $value = "="; 
    }     

echo "<b>".$name."</b> | ".$score." ".$value."<br>\n"; 
}

但是这段代码有两大问题:

1)在查询中我必须指定去年(ORDER BY s.2004),所以如果我在分数表中添加另一列(例如2005),我必须手动更改代码。

2)“$ value”var也是如此。如果我加上2005年,那么2004年和2003年之间的比较就会出错(应该是2005年到2004年之间)。

我知道我必须使用循环和数组但是......怎么样?

1 个答案:

答案 0 :(得分:0)

您应重新设计scores表格,以便将player_id,得分和年份存储在一行中。所以,每个分数都有自己的排。当您发现自己重复列时,通常会朝错误的方向前进。

然后,您的查询将如下所示:

选择年份(CURDATE());

select * 
from players p
inner join scores s on p.player_id = s.player_id 
where s.`Year` = Year(CURDATE()) --or (select max(Year) from Score)