У меня есть база данных рекордов для игры, которая отслеживает каждую игру в разных мирах. То, что я хочу сделать, это выяснить статистику по играм, а затем найти, где каждый мир «ранжируется» в соответствии с другим миром (отсортировано по количеству сыгранных раз).
Пока все мои статистические данные работают нормально, однако я столкнулся с проблемой определения рейтинга каждого мира.
Я также почти уверен, что выполнение этого в трех отдельных запросах, вероятно, является очень медленным способом и может быть улучшено.
У меня есть столбец отметки времени (здесь не используется) и столбец «мир», проиндексированный в схеме БД. Вот выбор моего источника:
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?