Ir para conteúdo

Arquivado

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

lucasoliveir4

Descobrir a posição o usuário em um ranking

Recommended Posts

Então galera, estou fazendo uma ferramenta que mostre a posição em que o usuário logado se encontra. Cheguei até a parte em que o algoritmo conta o total de usuários cadastrados, mas como achar em que posição o usuário atual se encontra não. Estou empacado nesse problema a dias e preciso de ajuda.

 

<?php

	
	
$id = $_GET['id'];
$sql = mysql_query("SELECT * FROM tabela_pontos ORDER BY pontos ASC");
$i=0;
$count = mysql_num_rows($sql);
$show = mysql_fetch_array($sql);

while ($show = mysql_fetch_array($sql))
    {
	
	echo 'posição:'. $i; 
   echo $show['ulogin'];
   echo $show['pontos'].'</br>';
                       
    }
	

echo "<br>São ".$count." pessoas no ranking";


//?>

Desde já, obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente incrementar o $i dentro do while e mude o valor inicial para 1.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como o Shini falou

 

 

 
$id = $_GET['id'];
$sql = mysql_query("SELECT * FROM tabela_pontos ORDER BY pontos ASC");
$i=0;
$count = mysql_num_rows($sql);
$show = mysql_fetch_array($sql);
 
while ($show = mysql_fetch_array($sql))
    {
 
echo 'posição:'. $i; 
   echo $show['ulogin'];
   echo $show['pontos'].'</br>';
 
//a cada loop vai aumentar 1
++$i;           
    }
 
 
echo "<br>São ".$count." pessoas no ranking";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outras coisinhas:

 

- a ordem tem de ser descendente, não ascendente como você colocou (troque o 'ASC' pelo 'DESC').

- $i tem de iniciar em 1

- E se dois usuários tiverem a mesma pontuação? Ele terão de, portanto, ocupar a mesma posição. Então ao invés de simplesmente incrementar $i, você precisa verificar se a pontuação anterior não é a mesma:

     if (!isset($pont_anterior) or $pont_anterior != $show['pontos']) {      echo "Posição: " . $i .'<br/>';      $i++;    }     echo $show['ulogin'].'<br/>';    echo $show['pontos'].'<br/>';                  $pont_anterior = $show['pontos'];

 

 

- A linha $show = mysql_fetch_array($sql); é redundante

Compartilhar este post


Link para o post
Compartilhar em outros sites

PrimeIro, Obrigado pelo suporte. To no trabalho não testei ainda. Mas eu entendi é que ele vai contar quantas pessoaa há no rank, levando em conta se há pessoas com a mesma posição. Certo?

A parte de pegar a posição do usuário logado é que complica, pois não consigo ver como usar o numero de posições ao meu favor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou com o mesmo problema do lucasoliveir4, não consigo pegar a posição de um usuario especifico, consigo numerar com o while como mostraram, porem so quero pegar a posição de um, no caso o que esta logado, alguem sabe ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou com o mesmo problema do lucasoliveir4, não consigo pegar a posição de um usuario especifico, consigo numerar com o while como mostraram, porem so quero pegar a posição de um, no caso o que esta logado, alguem sabe ?

Neste caso você terá que listar todos os usuários por pontos em ordem decrescente até achar o usuário desejado e a sua posição. Como isso pode demorar um certo tempo para processar, você pode armazenar o rank do usuário no banco de dados (adicionando um campo para o rank na tabela de usuários) e dar uma resposta mais rápida, se a mobilidade no ranking não for muito frequente...

Compartilhar este post


Link para o post
Compartilhar em outros sites

rapaz eu fiz isso outro dia de uma forma muito bem feita postei at[e aqui no grupo.. vc vai precisar de uma view

 

sabe trabalhar com views no mysql



aqui de uma forma bem simples e muito rápida... e diferente do que nosso amigo falou n fica nada lento fica como uma consulta normal

 

 

Exemplo...

 

Modelo:

 


 

create table usuarios (   id int auto_increment primary key,   nome varchar(40),   pontuacao int); insert into usuarios (nome, pontuacao) values ('fred', 90),('marcelo',120),('vanessa',50),('juliana',130),('geraldo',98);

 

 

Consulta:

 


 

SELECT @rownum:=@rownum+1 AS posicao, nome, pontuacao FROM usuarios u, (SELECT @rownum:=0) r ORDER BY pontuacao DESC

ai vc pode montar um view com esse select e quando quiser pegar uma posi;'ao s[o apontar um select para view



da para resolver tudo com sql sem por a mão em php com isso vc tem velocidade

Compartilhar este post


Link para o post
Compartilhar em outros sites

Descobrir o rank de um usuário pelo id (ou qualquer outro parâmetro)

 

 <?php/*Altere nome de usuário e senha na linha 52 Estrutura da tabela:idusuarios INT(11) PK AI | nome VARCHAR | pontos INT */  echo '<!DOCTYPE html><meta charset="utf-8">'; if (!isset($_GET['id'])) {    echo '<form action="">      <input type="text" name="id" required pattern="([0-9]+)">      <button type="submit">Rank</button>    </form>';} else {    $db = conecta();        $id = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT);        if(!$id) {        echo "Identificador precisa ser um número inteiro.";        exit();    }       $rank = pega_rank_por_id($id);           echo "<table>";    foreach ($rank as $campo => $valor)    {        echo '<tr>';        echo '<th scope="row">' . $campo . '</th>';        echo "<td>{$valor}</td>";        echo '</tr>';    }        foreach (array_values($rank) as $valor) {            }    echo "</table>";    }  /* * Abre conexão com o servidor MySQL e seleciona o banco de dados */function conecta() {    $mysqli = new mysqli('localhost', 'root', 'MyNewPass', 'test');     if ($mysqli->connect_error) {        die('Connect Error (' . $mysqli->connect_errno . ') '                . $mysqli->connect_error);    }        return $mysqli;}   /* * Pega o rank do usuário pelo seu identificador */function pega_rank_por_id($id){    global $db;     // De: http://stackoverflow.com/a/1293827    $sql = "SELECT            uo.*,             (              SELECT COUNT(*)              FROM `usuarios` AS ui              WHERE (ui.pontos, ui.idusuarios) >= (uo.pontos, uo.idusuarios)            ) AS rank    FROM `usuarios` AS uo    WHERE `idusuarios` = '{$id}'";      $res = $db->query($sql);        if (!$res) {        echo "Erro a pegar o rank por id";        exit();    }        if (!$res->num_rows) {        echo "Nenhum usuário com o identificador indicado";        exit();        }        $row = $res->fetch_assoc();        return $row;   }

 

Eu fiz usando o id como parâmetro, mas se preferir, pode-se também usar outro campo, como o nome do usuário, p.ex.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mangakah desculpe minha ignorancia, mas o que seriam esse 'ui' e 'uo', que aparecem nas seguintes partes

 

uo.*

e

 

 

 


FROM `usuarios` AS ui
WHERE (ui.pontos, ui.idusuarios) >= (uo.pontos, uo.idusuarios)
) AS rank
FROM `usuarios` AS uo
WHERE `idusuarios` = '{$id}'";

 

e Jordan Pinheiro_147113, nunca trabalhei com views então fiquei meio perdido, tentei achar seu post, mas não obtive sucesso!

 

Obrigado pelas respostas!

Compartilhar este post


Link para o post
Compartilhar em outros sites

copie o scrit q botei ali e jogue no seu phpmyadmin e teste.. esta tudo pronto de uma form amuito simples e profissional sem precisar de codigos

 

 

views [e uma forma de criar uma tabela em cima de uma consulta

 

create view usurious_rank as select * from usurious where rank = 100

 

 

quando vc roda o exemplo acima ele cria uma tabela com base na sua consulta q vc pode usar para criar outras consultas eu uso isso para controle de estoque, pagamentos e financeiro em geral

 

 

vi sua pergunta acima a o outro cara sobre o que seria (uo.)

 

isso é prefixo, vc pode usar taanto o nome da tabela como atribuir um encurtado, isso vale para na hora do join voce n ter campos com nomes iguais e da conflito `ambiguius~ rsrs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ficaria assim?

$sql = mysql_query("SELECT @rownum:=@rownum+1 AS posicao, nome, pontos FROM ranking u, (SELECT @rownum:=0) r ORDER BY pontos DESC");

 

e pra recuperar esse query?

EDIT: Recuperei o query, mas o problema e aquele, e pra pegar a posição do usuario logado? Pelo que vi, acredito que vou sar esse rownum, mas como recupera-lo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelos posts galera. Cheguei +/- no ponto que queria. Só preciso de um jeito de colocar um where na query, e se possivel incluir uma variavel na comparação.

 

$sql = mysql_query("SELECT posicao (SELECT @rownum:=@rownum+1 AS posicao, nome, pontos FROM ranking u, (SELECT @rownum:=0) r ORDER BY pontos DESC) WHERE u.nome='$variavel'");

Eu tentei essa e não deu certo. Seria por causa variavél?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jordan Pinheiro_147113, fiz o seguinte,

$sql = mysql_query(" SELECT @rownum:=@rownum+1 AS posicao, nome, pontos FROM ranking u, (SELECT @rownum:=0) r ORDER BY pontos DESC AND WHERE pontos=100");

 

porem não obtive sucesso, ficou do mesmo jeito.

Obrigado pelas respostas estão sendo de grande ajuda para mim e para o lucasoliveir4, que parece estar evoluindo da mesma maneira que eu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O usuário logado deve ter sua informação de id na session e quantidade de pontos atuais. Então você pega esses dados e faz um select count mais ou menos assim:

 

 

SELECT COUNT(1) AS posicao FROM usuarios WHERE pontos > $num_pontos_atuais

 

Essa query vai retornar a quantidade de pessoas que tem mais pontos que o usuário atual. Só pegar esse número, somar +1 e você tem a posição atual da pessoa no ranking.

Compartilhar este post


Link para o post
Compartilhar em outros sites

me mande como ta seu banco ai com alguns registros para eu testar aqui

 

== Table structure for table ranking

 

|------

|Column|Type|Null|Default

|------

|//**ulogin**//|varchar(30)|No|

|nome|varchar(30)|No|

|pontos|int(5)|No|

== Dumping data for table ranking

 

|alexturner|alex turner|100

|amywine|amy wine house|55

|lucastr|gabriel sylar|29

|hiro|hiro nakamura|95

|petrelli|peter petrelli|77

|ando|ando|68

|claire|claire bennet|40

== Table structure for table ranking

 

|------

|Column|Type|Null|Default

|------

|//**ulogin**//|varchar(30)|No|

|nome|varchar(30)|No|

|pontos|int(5)|No|

 

To com o projeto praticamente pronto, só falta essa parte das posições mesmo. E obrigado por me desbanirem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal também estou parado, porem em outra parte, fiz o seguinte

 

$sql = mysql_query("SELECT @rownum:=@rownum+1 AS posicao, nome, pontos FROM ranking u, (SELECT @rownum:=0) r WHERE pontos=100 ORDER BY pontos DESC");

Porem como esta retornando somente um valor a posição sempre vai ser 1 e a quantidade de resultado tambem, tudo por causa desse WHERE.

Acredito que teria que fazer uma query sem esse WHERE, e depois pegar esse resultado e fazer uma query dentro dele, pegando a posição correta.

Alguem sabe como fazer isso, ou como fazer da maneira correta?

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.