MySQL: ottimizza una query e trova un ranking basato sulla somma delle colonne
-
03-07-2019 - |
Domanda
Ho un database di punteggi elevati per un gioco che tiene traccia di ogni gioco in una varietà di mondi. Quello che voglio fare è scoprire alcune statistiche sulle opere teatrali, e quindi scoprire dove ogni mondo "classifica" " secondo l'altro mondo (ordinati per numero di volte giocate).
Finora ho funzionato bene tutte le mie statistiche, tuttavia ho riscontrato un problema nel trovare la classifica di ciascun mondo.
Sono anche abbastanza sicuro che farlo in tre query separate sia probabilmente un modo molto lento per farlo e probabilmente potrebbe essere migliorato.
Ho una colonna timestamp (non utilizzata qui) e il "mondo" colonna indicizzata nello schema DB. Ecco una selezione della mia fonte:
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.
}
Credo che la specifica riga di codice che mi manca sia nella query RANK
WHERE total > $total
Non funziona perché non può accettare un totale calcolato come argomento nella clausola WHERE?
Infine, esiste un modo più efficiente per calcolare tutto questo in una singola query SQL?
Soluzione
Penso che potresti voler usare 'have total > $ Totale '?
SELECT world, count(*) AS total
FROM highscores
GROUP BY world
having total > $total
ORDER BY total DESC