代码之家  ›  专栏  ›  技术社区  ›  Andy Moore

mysql-优化查询并根据列和查找排名

  •  1
  • Andy Moore  · 技术社区  · 15 年前

    我有一个高得分的游戏数据库,可以跟踪各种世界中的每一个游戏。我想做的是找出一些关于戏剧的统计数据,然后找出每个世界根据彼此的世界“排名”(按播放次数排序)。

    到目前为止,我所有的统计数据都运行得很好,但是我在查找每个世界的排名时遇到了一个问题。

    我也很确定在三个独立的查询中进行这项工作可能是一个非常缓慢的过程,而且可能会得到改进。

    我有一个时间戳列(这里没有使用)和数据库模式中索引的“世界”列。以下是我的资料来源:

    function getStast($worldName) {
      // ## First find the number of wins and some other data:
      $query = "SELECT COUNT(*) AS total, 
                AVG(score) AS avgScore, 
                SUM(score) AS totalScore
                FROM highscores 
                WHERE world = '$worldName'
                AND victory = 1";
      $win = $row['total'];
    
      // ## Then find the number of losses:
      $query = "SELECT COUNT(*) AS total 
                FROM highscores 
                WHERE world = '$worldName'
                AND victory = 0";
      $loss = $row['total'];
    
      $total = $win + $loss;
    
      // ## Then find the rank (this is the broken bit):
      $query="SELECT world, count(*) AS total 
              FROM highscores 
              WHERE total > $total
              GROUP BY world
              ORDER BY total DESC";
    
      $rank = $row['total']+1;
      // ## ... Then output things.
    }
    

    我相信让我失败的特定代码行在等级查询中,

                  WHERE total > $total
    

    它是否不起作用,因为它不能接受计算汇总作为WHERE子句中的参数?

    最后,有没有一种更有效的方法可以在单个SQL查询中计算所有这些内容?

    1 回复  |  直到 15 年前
        1
  •  4
  •   lsl    15 年前

    我想您可能想使用“合计”>$total?

    SELECT world, count(*) AS total 
    FROM highscores 
    GROUP BY world
    having total > $total
    ORDER BY total DESC