MySQL - eine Abfrage optimieren und einen Rang findet basierend auf Spalte Sum
-
03-07-2019 - |
Frage
Ich habe eine hohe Punktzahl Datenbank für ein Spiel, das jedes Spiel in einer Vielzahl von Welten verfolgt. Was ich tun möchte, ist, einige Statistiken über die Spiele erfahren, und dann finden, wo jeder Welt „Reihen“ nach jeder anderen Welt (sortiert nach Anzahl, wie oft gespielt).
Bisher habe ich habe all meine Statistiken arbeiten gut, aber ich habe auf ein Problem stößt das Ranking jeder Welt zu finden.
Ich bin auch ziemlich sicher, dass dies zu tun in drei separaten Abfragen ist wahrscheinlich ein sehr langsamer Weg, um darüber zu gehen und wahrscheinlich verbessert werden könnte.
Ich habe eine Timestamp-Spalte (nicht benutzte hier) und die „Welt“ Spalte in dem DB-Schema indiziert. Hier ist eine Auswahl meiner Quelle:
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.
}
ich die spezifische Codezeile glaube, dass ich versagt ist in der RANK-Abfrage
WHERE total > $total
Ist es nicht funktioniert, weil es nicht ein berechnetes Gesamt als Argument in der WHERE-Klausel akzeptieren kann?
Schließlich ist es eine effizientere Art und Weise all dies in einer einzigen SQL-Abfrage zu berechnen?
Lösung
Ich glaube, Sie könnten nutzen wollen 'mit insgesamt> $ total'?
SELECT world, count(*) AS total
FROM highscores
GROUP BY world
having total > $total
ORDER BY total DESC