Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.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";Outras coisinhas:
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'];
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.
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 ?
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...
Então mangakah, o problema é que não estou achando uma logica para achar o usuario desejado e pegar a posição, consigo pegar o usuario e a quantidade de pontos, mas não a posição.
Obrigado pela resposta !
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
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.
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!
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
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?
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?só por um and e passa suas condições
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!
me mande como ta seu banco ai com alguns registros para eu testar aqui
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.
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.
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?
tente incrementar o $i dentro do while e mude o valor inicial para 1.