Desenvolvendo Queries com Ranking no MySQL

Olá leitores,
Bom dia!

Recentemente tive uma necessidade de criar um ranking no MySQL semelhante ao ROW_NUMBER() do SQL Server. Infelizmente, a Oracle ainda não implementou esse recurso tão útil, mas como se tudo dá um jeito, vou mostrar a vocês como podemos implementar isso.

Uma forma bem simples de fazer isso, é criar uma tabela e incluir um campo de auto incremento, como o exemplo abaixo:

Dessa forma, cada linha terá o seu próprio ID incremental, que pode ser usado como Ranking.

O problema é quando precisamos criar queries um pouco mais complexas utilizando com joins e filtros e precisamos criar um ranking nessa query. Podemos criar uma tabela e guardar o resultado dessa query na tabela usando um auto incremento?
Sim, mas é um opção bem trabalhosa, principalmente se muitas colunas forem retornadas na query.

Populando dados de forma que a nossa tabela fique conforme a estrutura abaixo:

Podemos atender a nossa necessidade criando a query da seguinte forma:

E esse é o retorno:

Exatamente o que eu precisava!

Até a próxima!

SQL, sql server, sql server 2008, sql server 2008 R2, Oracle, Oracle Database, Oracle 11g, Oracle 10g, Oracle 12c, MySQL, Firebird, Consultoria, Consultor, Programador, Programação. Desenvolvedor, Analista de Sistemas, DBA, Criação de website, Criação de Sistema Web, Vitória, Vila Velha, Guarapari, Espírito Santo, ES, Consultoria SQL em VItória, Treinamento, Curso, Prestação de serviço, prestar serviço, freelancer, freela, banco de dados, consultoria em banco de dados, consultor de banco de dados

2 comentários em “Desenvolvendo Queries com Ranking no MySQL

  1. Bom dia Dirceu!

    Muito bom o post, funcionou direitinho. Contudo o problema é que não é possível filtrar os resultados pela coluna rank na cláusula WHERE, pois resulta como coluna desconhecida.

    Exemplo:

    SELECT
    id,
    nome,
    idade,
    @curRank := @curRank + 1 AS rank
    FROM
    teste p,
    (SELECT @curRank := 0) r
    ORDER BY
    idade
    WHERE
    rank BETWEEN 1 AND 5 || nome=’Bartolomeu’

    Resulta em erro do tipo “#1054 – Unknown column ‘rank’ in ‘where clause'”

    Abraços!!

    1. Danilo,
      Boa noite!

      Primeiramente, obrigado pela visita!

      Para filtrar utilizando o Ranking que você criou, pode-se utilizar subqueries:

      SELECT *
      FROM (
      SELECT
      id,
      nome,
      idade,
      @curRank := @curRank + 1 AS rank
      FROM
      teste p,
      (SELECT @curRank := 0) r
      ORDER BY
      idade
      ) A
      WHERE
      A.rank >= 5

Deixe uma resposta