查找MySQL记录的总体排名,并确定是否并列


Find overall rank of a MySQL record and determine if tied

我使用以下代码检索玩家在6个类别中的总体排名(已玩游戏、进球、辅助等)该代码运行良好,要么产生总排名,要么如果玩家与另一名玩家打平,则在排名前添加一个"T-"(即"排名第152位"或"排名第T-152位")。

假设玩家的统计数据已经被查询过,在这种情况下,存储为$GP_total。

$get_GP_rk = $pdo -> prepare("SELECT GP FROM player_career WHERE GP>=:GP_total");
$get_GP_rk -> bindParam(':GP_total',$GP_total);
$get_GP_rk -> execute();
$result_GP_rk = $get_GP_rk -> fetchAll(PDO::FETCH_COLUMN, 0);
$tie_GP_rk = array_count_values($result_GP_rk);
if ($tie_GP_rk[$GP_tot] == 1){
    $GP_rk = $get_GP_rk -> rowCount();
}
else {
    $GP_rk = "T-".(($get_GP_rk -> rowCount())-($tie_GP_rk[$GP_tot]-1));
}

我的问题是,我使用这个代码块6次,这大大减慢了我的页面加载时间。

有没有更快/更精简的方法来实现这一点?简单地说,我需要以下6个字段:

1) 玩家的价值

2) 有多少人的比他多

3) 如果他和的任何人绑在一起

提前感谢!

编辑***样品台结构

ID    GP    Goals    Assists    Points    Penalties    Shots
101   36    14       12         26        8            36
102   25    9        17         26        2            59
103   8     1        5          6         0            12

好吧,这里有一个想法,但您需要更多地了解如何处理关系。。。

SELECT x.*
     , COUNT(*) rank
  FROM (
SELECT  player_id, 'GP' stat, GP score FROM stats
UNION
SELECT  player_id, 'Goals', Goals FROM stats
UNION
SELECT  player_id, 'Assists', Assists FROM stats
UNION
SELECT  player_id, 'Points', Points FROM stats
UNION
SELECT  player_id, 'Penalties', Penalties FROM stats
UNION
SELECT  player_id, 'Shots', Shots FROM stats
) x
JOIN (
SELECT  player_id, 'GP' stat, GP score FROM stats
UNION
SELECT  player_id, 'Goals', Goals FROM stats
UNION
SELECT  player_id, 'Assists', Assists FROM stats
UNION
SELECT  player_id, 'Points', Points FROM stats
UNION
SELECT  player_id, 'Penalties', Penalties FROM stats
UNION
SELECT  player_id, 'Shots', Shots FROM stats
) y
ON y.stat = x.stat
AND y.score >= x.score
GROUP BY stat,score,player_id ORDER BY stat,rank;