Existe alguma maneira de obter o número real da linha de uma consulta?
Eu quero ser capaz de ordenar uma mesa chamada league_girl por um campo chamado score; e retornar o nome de usuário e a posição real da linha desse nome de usuário.
Estou querendo classificar os usuários para que eu possa dizer onde um determinado usuário está, ou seja, Joe está na posição 100 de 200, ou seja,
User Score Row
Joe 100 1
Bob 50 2
Bill 10 3
Eu vi algumas soluções aqui, mas tentei a maioria delas e nenhuma delas realmente retorna o número da linha.
Eu tentei isso:
SELECT position, username, score
FROM (SELECT @row := @row + 1 AS position, username, score
FROM league_girl GROUP BY username ORDER BY score DESC)
Como derivado
... mas não parece retornar a posição da linha.
Alguma ideia?
Respostas:
Você pode tentar o seguinte:
A
JOIN (SELECT @curRow := 0)
parte permite a inicialização da variável sem exigir umSET
comando separado .Caso de teste:
Consulta de teste:
Resultado:
fonte
@curRow
substituindo aJOIN
instrução por uma vírgula, como esta:FROM league_girl l, (SELECT @curRow := 0) r
ORDER BY
?fonte
Aí vem a estrutura do template que usei:
E aqui está meu código de trabalho:
fonte
Você também pode usar
para inicializar a variável do contador.
fonte
@curRow
pode ainda ter um valor da última vez que você executou esta consulta na sessão atual.Supondo que o MySQL seja compatível, você pode fazer isso facilmente com uma subconsulta SQL padrão:
Para grandes quantidades de resultados exibidos, isso será um pouco lento e você desejará alternar para uma autojunção.
fonte
Se você deseja apenas saber a posição de um usuário específico após a ordem de pontuação de campo, você pode simplesmente selecionar todas as linhas de sua tabela onde a pontuação de campo é maior do que a pontuação do usuário atual. E use o número da linha retornado + 1 para saber qual posição deste usuário atual.
Supondo que sua tabela
league_girl
e seu campo primário sejamid
, você pode usar isto:fonte
Achei a resposta original extremamente útil, mas também queria pegar um determinado conjunto de linhas com base nos números das linhas que estava inserindo. Como tal, envolvi toda a resposta original em uma subconsulta para que pudesse fazer referência ao número da linha que estava inserindo.
Ter uma subconsulta em uma subconsulta não é muito eficiente, então valeria a pena testar se você obtém um resultado melhor fazendo com que seu servidor SQL trate essa consulta ou busque a tabela inteira e faça com que o aplicativo / servidor da web manipule as linhas após o fato .
Pessoalmente, meu servidor SQL não está muito ocupado, portanto, é preferível que ele lide com as subconsultas aninhadas.
fonte
Eu sei que o OP está pedindo uma
mysql
resposta, mas como descobri que as outras respostas não estão funcionando para mim,order by
Portanto, para economizar tempo para outras pessoas como eu, apenas indexe a linha após recuperá-la do banco de dados
exemplo em PHP:
exemplo em PHP usando deslocamento e limite para paginação:
fonte