MySQL – оптимизируйте запрос и найдите рейтинг на основе суммы столбца

StackOverflow https://stackoverflow.com/questions/800467

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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-запросе?

Это было полезно?

Решение

Я думаю, вы, возможно, захотите использовать «всего > $total»?

SELECT world, count(*) AS total 
FROM highscores 
GROUP BY world
having total > $total
ORDER BY total DESC
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top