joaocasta Posted April 5, 2013 at 08:39 PM Report #501890 Posted April 5, 2013 at 08:39 PM (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 April 5, 2013 at 08:40 PM by joaocasta
yoda Posted April 5, 2013 at 09:15 PM Report #501894 Posted April 5, 2013 at 09:15 PM (edited) Não percebi o que está a acontecer Edited April 5, 2013 at 09:15 PM by yoda before you post, what have you tried? - http://filipematias.info sense, purpose, direction
joaocasta Posted April 5, 2013 at 09:21 PM Author Report #501895 Posted April 5, 2013 at 09:21 PM 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.
yoda Posted April 5, 2013 at 09:30 PM Report #501899 Posted April 5, 2013 at 09:30 PM (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 April 5, 2013 at 09:30 PM by yoda before you post, what have you tried? - http://filipematias.info sense, purpose, direction
HappyHippyHippo Posted April 5, 2013 at 10:13 PM Report #501909 Posted April 5, 2013 at 10:13 PM 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. 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
joaocasta Posted April 6, 2013 at 07:39 AM Author Report #501923 Posted April 6, 2013 at 07:39 AM yoda não era bem isso que queria. Happy tentei isso, mas a query nao me retornava nenhum resultado no PHPMyAdmin. Penso que não seja bem assim a query.
HappyHippyHippo Posted April 6, 2013 at 09:12 AM Report #501926 Posted April 6, 2013 at 09:12 AM deste-te (ao menos) ao trabalho de adaptar a query ao teu problema ? e qual o SQL que testaste ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
joaocasta Posted April 6, 2013 at 09:41 AM Author Report #501929 Posted April 6, 2013 at 09:41 AM Sim adaptei. Coloquei isto SELECT * FROM points LIMIT 5 UNION SELECT * FROM points WHERE username = 'joaocasta' NOT IN (SELECT * FROM points LIMIT 5) Mas não me retorna nada.
HappyHippyHippo Posted April 6, 2013 at 12:15 PM Report #501945 Posted April 6, 2013 at 12:15 PM verificaste se o SQL tem erros de sintaxe ? se a execução retorna erro ? se não retorna erro, e não retorna nada é porque a tabela não tem registos IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
joaocasta Posted April 6, 2013 at 03:45 PM Author Report #501967 Posted April 6, 2013 at 03:45 PM apareceu este erro em baixo na consola. /* SQL Error (1235): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' */
brunoais Posted April 6, 2013 at 06:41 PM Report #501987 Posted April 6, 2013 at 06:41 PM 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%.
joaocasta Posted April 6, 2013 at 07:04 PM Author Report #501991 Posted April 6, 2013 at 07:04 PM (edited) Acho que é esta. MySQL client version: mysqlnd 5.0.9-dev - 20110325 - $Revision: 315975 $ Edited April 6, 2013 at 07:06 PM by joaocasta
brunoais Posted April 6, 2013 at 07:37 PM Report #501993 Posted April 6, 2013 at 07:37 PM 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%.
joaocasta Posted April 6, 2013 at 07:58 PM Author Report #501999 Posted April 6, 2013 at 07:58 PM Como posso mudar?
brunoais Posted April 7, 2013 at 08:48 AM Report #502011 Posted April 7, 2013 at 08:48 AM 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%.
joaocasta Posted April 7, 2013 at 08:55 AM Author Report #502012 Posted April 7, 2013 at 08:55 AM 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?
brunoais Posted April 7, 2013 at 09:25 AM Report #502013 Posted April 7, 2013 at 09:25 AM 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%.
joaocasta Posted April 7, 2013 at 09:31 AM Author Report #502014 Posted April 7, 2013 at 09:31 AM (edited) username -> TEXT points -> INT multiplied_points -> INT time -> DATE É isto que tenho Edited April 7, 2013 at 09:31 AM by joaocasta
HappyHippyHippo Posted April 7, 2013 at 09:54 AM Report #502016 Posted April 7, 2013 at 09:54 AM 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 Portugol Plus
brunoais Posted April 7, 2013 at 09:57 AM Report #502017 Posted April 7, 2013 at 09:57 AM (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 April 7, 2013 at 10:00 AM 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%.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now