MySQL - оптимизировать запрос и найти рейтинг по столбцу Sum - PullRequest
1 голос
/ 29 апреля 2009

У меня есть база данных рекордов для игры, которая отслеживает каждую игру в разных мирах. То, что я хочу сделать, это выяснить статистику по играм, а затем найти, где каждый мир «ранжируется» в соответствии с другим миром (отсортировано по количеству сыгранных раз).

Пока все мои статистические данные работают нормально, однако я столкнулся с проблемой определения рейтинга каждого мира.

Я также почти уверен, что выполнение этого в трех отдельных запросах, вероятно, является очень медленным способом и может быть улучшено.

У меня есть столбец отметки времени (здесь не используется) и столбец «мир», проиндексированный в схеме БД. Вот выбор моего источника:

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.
}

Я считаю, что конкретная строка кода, которая мне не подходит, находится в запросе RANK,

              WHERE total > $total

Разве это не работает, потому что не может принять вычисленную сумму в качестве аргумента в предложении WHERE?

Наконец, есть ли более эффективный способ вычислить все это в одном запросе SQL?

1 Ответ

4 голосов
/ 29 апреля 2009

Я думаю, что вы могли бы использовать 'иметь общее количество> всего $'?

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