MySQL - Otimizar uma consulta e encontrar uma classificação com base em coluna Sum

StackOverflow https://stackoverflow.com/questions/800467

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho um banco de dados de alta pontuação para um jogo que faixas cada jogo em uma variedade de mundos. O que eu quero fazer é descobrir algumas estatísticas sobre os jogos, e, em seguida, descobrir onde cada mundo "fileiras" de acordo com o outro mundo (classificadas por número de vezes jogado).

Até agora eu tenho todas as minhas estatísticas funcionando bem, no entanto eu correr em um problema em encontrar a classificação de cada mundo.

Eu também estou bastante certo de fazer isso em três consultas separadas é provavelmente uma maneira muito lenta para ir sobre isso e provavelmente poderia ser melhorado.

Eu tenho uma coluna timestamp (não utilizado aqui) e a coluna "mundo" indexados no esquema DB. Aqui está uma seleção de minha 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.
}

Eu acredito que a linha específica de código que está falhando me é na consulta RANK,

              WHERE total > $total

É não funciona porque não pode aceitar um total calculado como um argumento na cláusula WHERE?

Finalmente, há uma maneira mais eficiente para calcular tudo isso em uma única consulta SQL?

Foi útil?

Solução

Eu acho que você pode querer usar 'ter total> $ total'?

SELECT world, count(*) AS total 
FROM highscores 
GROUP BY world
having total > $total
ORDER BY total DESC
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top