Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

BrendonPawn

Buscar posição em ranking

Recommended Posts

Olá amigos, gostaria que me ajudassem a solucionar um problema que estou tendo e não estou encontrando a solução. Eu quero fazer uma função que exibe a sua posição em um ranking salvo em mysql.

 

#mysql

SELECT score FROM usuarios

 

#php - function

function buscar_rank($usuario){

#listar todos os scores de todos os usuarios e exibir somente o do solicitado.

}

 

#Exemplo - tabela

Joao - 15

Pedro - 20

Maria - 22

Carlos - 18

 

#Exemplo - usando

echo buscar_rank('maria'); retorna > 1

echo buscar_rank('joao'); retorna > 4

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei como está sua tabela, mas acho que a sua dúvida é o que ter na função que busca a pontuação certo?

 

Sua função poderia estar assim:

function buscar_rank($usuario = null) {
    //caso o usuario esteja nulo, retornamos todos os usuários
    if ($usuario == null) {
        return mysql_query("SELECT nome, score FROM usuarios");
    } else {
        //retornamos apenas do usuario desejado
        $query = mysql_query("SELECT score FROM usuarios WHERE nome = '$usuario'");
        $row = mysql_fetch_row($query);
        return $row[0];
    }
}

 

Aí é só usar a função:

//exibindo do usuario desejado
echo buscar_rank('maria'); //valor do rank de maria

//exibindo de todos os usuários
$result = buscar_rank();
while ($row = mysql_fetch_assoc($result)) {
    echo $row['nome'] . ' - ' . $row['score'];
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

se esta salvo no banco so fazer

//mostra forma decrescente ex : 10,9,8,7,6,5,4,3,2,1

SELECT score FROM usuarios ORDER BY campo_rank DESC

 

////mostra forma crescente ex : 1,2,3,4,5,6,7,8,9,10

SELECT score FROM usuarios ORDER BY campo_rank ASC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcielo, muito obrigado pela disposição, mas esse ai é oque eu uso:

function busca($campo){
	conectar();
	$usuario = $_SESSION['usuario'];
	$query = "SELECT * FROM `jogadores` WHERE jogador='$usuario'";
	$query = mysql_query($query);
	$var = mysql_fetch_array($query);
	return $var["".$campo.""];    	
}

Uso: echo busca('score'); // retorna o score do usuario


Mas eu gostaria de retornar a posição no ranking e não o valor do score. tipo:

Maria = 10
Joao = 5

Mostraria que maria está em 1º e Joao em 2º.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora entendi, eu conheço duas maneiras de se fazer, uma seria mais simples, retornando todos os jogadores do banco e incrementando até encontrar o jogador desejado usando o PHP para isso, porém se em sua tabela houverem muitos registros o desempenho seria completamente comprometido, então isso é inviável. A outra maneira e que julgo uma forma mais correta e solucionável é utilizar subquery para fazer a consulta.

 

Na primeira query selecionaríamos o jogador desejado.

SELECT score from jogadores WHERE jogador = $usuario

 

Na segunda, apenas verificamos o resultado da primeira e ordenamos em ordem descendente assim a função COUNT() contará a quantidade de registros enquanto a condição for satisfeita.

SELECT (COUNT(1) + 1) as posicao FROM jogadores WHERE score > (...PRIMEIRA QUERY...) ORDER BY score DESC;

 

O SQL completo ficaria assim:

SELECT (COUNT(1) + 1) as posicao FROM jogadores WHERE score > (SELECT score from jogadores WHERE jogador = $usuario) ORDER BY score DESC

 

Creio que ainda você não teria o melhor desempenho de todos, mas deixar para o banco resolver problemas de banco com certeza é muito mais rápido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não testei a segunda opção porque o projeto está no meu pc do trabalho, mas a primeira opção sempre retornará 1° lugar, porque ele vai listar todos os jogadores com a condição 'jogador=$usuario' ou seja só vai retornar 1 pessoa, e essa pessoa sempre será o 1° lugar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Errado! Porque na primeira query ele apenas estará selecionando na base o jogador desejado, o que ele retornará para a query antecessora é resultado do score desse jogador. Essa query antecessora que eu descrevi como sendo a segunda ele irá comparar todos os registros da sua tabela com o score do jogador selecionado, enquanto houver jogadores com maior pontuação que a do selecionado ele irá contando a posição do ranking e essa contagem estará sendo realmente da posição do jogador no rank, pois a consulta estará ordenado pelo score em ordem decrescente, ou seja, dos maiores scores ao menor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi, de que função você está falando? Se for a função para retornar ranking, oras, simples!

 

Basta usar o SQL que fiz para você:

function busca_ranking($usuario) {
    //aqui aquele SQL do post #6
    $sql = "SELECT (COUNT(1) + 1) as posicao FROM jogadores WHERE score > (SELECT score from jogadores WHERE jogador = $usuario) ORDER BY score DESC";
    $query = mysql_query($sql);
    $fetch = mysql_fetch_array($query);
    return $fetch['posicao'];    	
}

echo busca_ranking(1); //exibe a posição do ranking do usuário

 

Obs.: se sua tabela não possui chave primária, coloque!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Show! Só pra se caso alguém querer o script, apenas corrigir o ( jogador = $usuario ) para (jogador = '$usuario'). A minha tabela tem Primary Key sim.

+REP

Obrigado ae!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.