MySQL – оптимизируйте запрос и найдите рейтинг на основе суммы столбца
-
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