Jump to content

Como fazer para aparecer um rank e depois aparecer o meu rank em baixo


Recommended Posts

Posted (edited)

Boas pessoal. Já tenho este código que me mostra isto:

1 xxxx 50

2 xxxx 49

3 xxxx 44

4 xxxx 20

5 xxxx 15


<?php
require 'config.php';
$query = mysql_query("SELECT * FROM points ORDER BY `points` DESC");

$i = 0;
while ($row = mysql_fetch_assoc($query)) {
$i++;
echo $i . " ";
echo $row['username'] . " ";
		echo $row['points'] . "<br/>";
	}

?>

O que eu queria que me mostrasse era tipo isto, onde aparecem 5 lugares ou mais e depois em baixo aparece onde eu estou, mas so aparece o de baixo se nao estiver em nenhum dos de cima:

1 xxxx 50

2 xxxx 49

3 xxxx 44

4 xxxx 20

5 xxxx 15

200 xxxx 1

Edited by joaocasta
Posted

Bem me parecia que não ia conseguir explicar-me. 😕

É assim eu quero que mostre o TOP 10 MELHORES e depois se eu não estivesse nesses 10 MELHORES iria aparecer o lugar onde eu estava, por exemplo se eu estivesse no 100 lugar ou 200 ou seja lá o que for.

Expliquei-me melhor?

Desculpem o incomodo.

Posted (edited)

Tinha percebido essa parte, mas depois a tua explicação do que estava a acontecer não foi tão clara.

Experimenta isto (testa primeiro a query no phpmyadmin ou algo similar) :

<?php
$user = 1; // imaginando que este é o ID do user actual, ou o teu neste caso
require 'config.php';
$query = mysql_query("SELECT * FROM points LIMIT 5 UNION ALL SELECT * FROM points WHERE user_id = $user ORDER BY `points` DESC");
$i = 0;
while ($row = mysql_fetch_assoc($query)) {
$i++;
echo $i . " ";
echo $row['username'] . " ";
					echo $row['points'] . "<br/>";
			}
?>
Edited by yoda
Posted

Experimenta isto (testa primeiro a query no phpmyadmin ou algo similar) :

se o resultado estiver no top, irá aparecer após a lista ...

acho que o mais simples (alterando pouco no SQL que apresentaste é fazer o segundo select ter uma negação de projecção no primeiro select.

algo deste género:

select *
 from tbl
limit 5
union
select *
 from tbl
where id = '12'
not in (select *
         from tbl
        limit 5)

desta forma, caso o registo estiver no top, é descartado na projecção NOT IN e não é apresentado na união.

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Posted

wow what?

Que raio de versão do MySQL é que está a usar?!?!?

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Posted

Atualiza o MySQL para a versão 5.5, no mínimo.

A versão 5.0 já é muito velha (e acho que já n é suportada).

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Posted

Depende do OS, depende se usas um package pre-formatado ou não.

Para qualquer um desses casos, a solução é bastante diferente.

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Posted

Mas o problema poderá estar aí?


(select * from points ORDER BY points DESC LIMIT 5)
UNION
(select * from points WHERE username = 'joaocasta')

Tentei com esta query, mas o problema é que diz que eu estou em 6º lugar, mas na realidade estou em 10º.

Será que tenho de trocar alguma coisa na incrementação?

Posted

Como é que tens essa tabela formatada?

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Posted

pensa um bocadito ...

se o query retornar 5 registos então o registo encontrasse no top 5, se retornar 6 porque não está

ter o registo na posição 6 do result set não quer dizer que se encontra na 6ª posição da tabela !!!

eu dei uma solução que necessitava de poucas alterações à proposta do @yoda, não quer dizer que eu teria feito dessa forma.

$sql = "..."; // ler o top 5
$rs = /* ... */; // executar o query

$in_top = false;
foreach ($rs as $record)
{
 /* verificar se o registo se encontra no top 5 */
 if (/* ... */)
 {
   $in_top = true;
 }
 /* apresentar o registo */
}

if (!$in_top)
{
 $sql = "..."; // SQL de ler o registo
 $rs_player /* ... */; // ler o registo da BD

 $player_points = /* ... */;

 $sql = "select count(...) from tbl where points > '$player_points'"; // SQL para saber a verdadeira posição do jogador

 /* ... patati patata ... */
}
IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

Fazer isso só com 1 query não me parece ser trivial, mas com o UNION já tens o que queres.

O que eu consigo pensar para se conseguir fazer isso só com queries à DB, assim de repente, requer 4 queries.

1 já tens (n a vou explicar).

Precisas de uma subQuery para obter quantos pontos tens.

Precisas de uma query para contar quantos têm pontos maiores/menores (O maior/menor depende do significado da pontuação) que tu.

Precisas de uma query para obter os teus dados e inserir (usando as outras sub-queries) a posição aonde estás.

Vê se com isto consegues descobrir uma boa query para fazeres à DB. Já te dei o pacote todo com os ingredientes, já só falta fazer o sumo.

Edited by brunoais
(O maior ou menor depende do significado da pontuação)

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.