2009-04-29 5 views
1

Ich habe eine Highscore-Datenbank für ein Spiel, das jedes Spiel in einer Vielzahl von Welten verfolgt. Ich möchte Statistiken über die Spiele herausfinden und dann herausfinden, wo jede Welt sich nach der anderen Welt "sortiert" (sortiert nach der Anzahl der gespielten Zeiten).MySQL - Optimieren Sie eine Abfrage und finden Sie einen Rang basierend auf Spalte Summe

Bisher habe ich alle meine Statistiken funktioniert gut, aber ich habe ein Problem mit dem Ranking der einzelnen Welt gefunden.

Ich bin mir auch ziemlich sicher, dies in drei separaten Abfragen zu tun ist wahrscheinlich ein sehr langsamer Weg, um darüber zu gehen und könnte wahrscheinlich verbessert werden.

Ich habe eine Timestamp-Spalte (nicht hier verwendet) und die "World" -Spalte im 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 glaube, die spezifische Codezeile, die hat versagt ich in der RANK-Abfrage ist,

   WHERE total > $total 

Ist es nicht funktioniert, weil es nicht eine berechnete Gesamt akzeptieren als ein Argument in der WHERE-Klausel?

Schließlich gibt es eine effizientere Möglichkeit, all dies in einer einzigen SQL-Abfrage zu berechnen?

Antwort

4

Ich denke, Sie möchten 'total> $ total' verwenden?

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

oder läuft das auf das gleiche Problem? – Louis

+0

"Ungültige SQL Syntax" Fehler auf beiden "wo" und "mit" :( –

+0

überarbeitet, ist das, was Sie verwendeten? – Louis

Verwandte Themen