最快的查询从统计数据获得排名

时间:2011-06-19 11:15:59

标签: php mysql

我想从数据库中获得玩家的等级。问题是ORDER BY不会削减它。

我有一张统计表,每个统计数据都有一个ID(唯一),玩家ID和积分。 我希望从统计数据中获得某个玩家的等级,其中等级被定义为点数的平均值。

所以,如果我有2名玩家,其中一名玩家平均得分为5分,另一次玩4次,第一名玩家排名第一,第二名玩家排名第二。

问题在于统计表的大小。它有大约100,000行和每个大约20个col(不仅仅是积分,我希望在所有可能的东西中得到它的排名,比如罚球和更多)。

如何以最快的方式实现它有20列? 我现在所做的是得到所有玩家的平均值,而不是PHP我检查有多少比我们玩家的平均值更好,这就是等级。 但是,查询本身大约需要10秒钟。而且我在一个页面中不止一次这样做。

我正在添加需要花费大量时间的查询,这是团队所以想象它与玩家一样。

$p2pQuery = '100*avg(s.P2M/s.P2A)';
$p3pQuery = '100*avg(s.P3M/s.P3A)';
$ftpQuery = '100*avg(s.FTM/s.FTA)';
$effQuery = 'avg(s.P2M - s.P2A + s.P3M - s.P3A + s.FTM - s.FTA + s.TOT + s.AST + s.ST + s.FV + s.PTS - s.TO - s.CM)';

$whatWeWant = " avg(s.P2M) as P2M, avg(s.P2A) as P2A,  $p2pQuery as P2P,
    avg(s.P3M) as P3M, avg(s.P3A) as P3A,  $p3pQuery as P3P,
    avg(s.FTM) as FTM, avg(s.FTA) as FTA,  $ftpQuery as FTP,
    avg(s.OFFENSE) as OFFENSE, avg(s.DEF) as DEF, avg(s.TOT) as TOT, 
    avg(s.AST) as AST, avg(s.TO) as 'TO', avg(s.ST) as ST, avg(s.FV) as FV, avg(s.CM) as CM, avg(s.PTS) as PTS,
    $effQuery as EFF";

$db = dbConnect();
$allTeamsString = "SELECT t.ID as ID, $whatWeWant FROM teams as t, gamesstats as gs, stats as s
    WHERE gs.LeagueId = $ESCleague 
    AND gs.SeasonStart = $ESCseason
    AND t.ID <> $ESCteam
    AND ((gs.HomeTeamID = t.ID AND gs.HomeStat = s.ID) 
        OR (gs.VisitorTeamID = t.ID AND gs.VisitorStat = s.ID))
    GROUP BY t.ID";
$allTeamsQuery = MyQuery($allTeamsString);
$allTeams = resultSet2RowArray($allTeamsQuery, true);
mysql_close ($db);

逻辑是。我得到每个统计数据中每个团队的平均值,并且对于每个统计数据,我都会检查查询中的团队数量,其值大于我们团队的数据。

2 个答案:

答案 0 :(得分:0)

MySQL没有RANK功能。我找到了一个MySQL配方here的集合,用于在各种条件下查询排名。

答案 1 :(得分:0)

我认为在这两个外键上添加索引是个好主意:

ALTER TABLE `gamesstats` ADD INDEX `gs_index1` (`HomeTeamID` ASC, `HomeStat` ASC);
ALTER TABLE `gamesstats` ADD INDEX `gs_index2` (`VisitorTeamID` ASC, `VisitorStat` ASC);