Consultando a posição (linha) no mysql

829 views
Skip to first unread message

LuisRohden

unread,
Oct 26, 2009, 12:52:22 PM10/26/09
to LISTA PHP
Boa tarde.

Estou dificuldades de resolver um problema aparentemente simples.

Tenho uma tabela de usuarias(id, usuaria ,pontos),
gostaria de fazer um consulta mysql para retornar a posição de um
determinada usuária em releção aos pontos dela. Se fosse fazer isto de
maneira rudimentar faria:
$id=mysql_real_escape_string($_GET['id']);
$i=1;
$exec=mysql_query('SELECT id,usuaria FROM usuarias ORDER BY pontos
DESC');
while($res=mysql_fetch_assoc($exec)){
if($res['id']==$id){$pos=$i;}
$i++
}

$pos seria o que eu queria. Mas no entanto sei que deve ter uma
maneira de fazer isso em uma consulta, mas nao saberia dizer como.
Alguem tem alguma sugestão de query?

Laerte Mateus Rodrigues

unread,
Oct 26, 2009, 1:16:05 PM10/26/09
to list...@googlegroups.com
não entendi o q vc qr, o q c ta kerendo eh coisa do tipo assim

maria 10pt
joana 15pt
ana 30pt

se eu buscar ana me retorna ela como 1º lugar?

2009/10/26 LuisRohden <luisr...@gmail.com>



--
Grato

http://laertemateus.com

LuisRohden

unread,
Oct 26, 2009, 2:58:42 PM10/26/09
to LISTA PHP
Laerte, valee pela atençao mas não é isso não

é tipo

maria 10pt
joana 15pt
ana 30pt

Eu quero perguntar por um sql qual é a posição de Joana e ele me
responder, ela está em segundo

Tenho uma lista de usuárias que quer saber qual seu posicionamento no
ranking, e eu quero através de uma consulta trazer a posição delas em
relação as outras

Joao Gabriel Nóbrega dos Santos

unread,
Oct 26, 2009, 3:13:33 PM10/26/09
to list...@googlegroups.com
faz com esse SQL mesmo:


"SELECT id,usuaria FROM usuarias ORDER BY pontos DESC"

da um fecth como array...

varre os registros e coloca um if:

if ( $row[i] == 'Joao' )
 echo i;


acho q isso resolve..

flwww

2009/10/26 LuisRohden <luisr...@gmail.com>



--
Joao Gabriel Nóbrega dos Santos
Sistemas para Internet - IFPB
www.twitter.com/joao2507
+55 83 8826-9877

LuisRohden

unread,
Oct 26, 2009, 3:22:29 PM10/26/09
to LISTA PHP
Sim João, isto até resolveria, se eu tivesse poucos registros no
banco, com poucas consultas realizadas.
No entanto eu tenho um banco com milhares de registros com muitas
consultas simultaneas.

Não posso ficar buscando todas as informações no banco para chegar a
esta resposta.

Outra alternativa poderia ser

SELECT COUNT(1) FROM usuarias WHERE pts>(SELECT pts from usuarias
where id=$_GET['id']);
o resultado deste count seria a pos que ela ocupa no ranking. Mas
acredito q deve haver um comando mysql que traga esta resposta sem
gambiarra

João Paulo Simões Cardoso

unread,
Oct 26, 2009, 3:29:25 PM10/26/09
to list...@googlegroups.com
Esta consulta seria muito lenta, evite subquery.

2009/10/26 LuisRohden <luisr...@gmail.com>

LuisRohden

unread,
Oct 26, 2009, 3:39:46 PM10/26/09
to LISTA PHP
João Paulo, eu sei q a consulta é lenta...
Por isso estou procurando uma instrução sql q resolva meu problema.
Estou fuçando na net: o que encontrei q talvez poderia me ajudar eu
não estou entendendo

veja:

SELECT itemID, avgrating, numvotes, rank FROM ( SELECT s.itemID, AVG
(v.rating)
'avgrating', COUNT(v.itemID) 'numvotes', @num := @num+1 'rank'
FROM itemes s JOIN votes v USING (itemID) GROUP BY v.itemID) AS A
WHERE itemID = 123

Só que preciso de algo mais simples, nao preciso média, nem nada. só
posição da dica cuja usuária.
Se os seres humanos não fossem tao competitivos nao teria este
problema, mas são, e quero resolver cde maneira otimizada XD

Joao Gabriel Nóbrega dos Santos

unread,
Oct 26, 2009, 3:49:08 PM10/26/09
to list...@googlegroups.com
achei isso aki brother..

http://forums.mysql.com/read.php?10,36490,36511

2009/10/26 LuisRohden <luisr...@gmail.com>

João Paulo Simões Cardoso

unread,
Oct 26, 2009, 4:03:43 PM10/26/09
to list...@googlegroups.com
Cara, acho que o jeito vai ser fazer na mão mesmo (tratar no PHP), porque sempre vai cair na subquery.

Falou

2009/10/26 Joao Gabriel Nóbrega dos Santos <joao...@gmail.com>

Beatriz KMS

unread,
Oct 26, 2009, 8:39:07 PM10/26/09
to list...@googlegroups.com
Quando a solução é subquery usa subquery mesmo..... melhor subquery do
que acessar o banco mais de uma vez.

2009/10/26 João Paulo Simões Cardoso <jpaulos...@gmail.com>:

Alexandre Gaigalas

unread,
Oct 26, 2009, 9:43:06 PM10/26/09
to list...@googlegroups.com
Opa,

Nem sempre subquery é melhor que consultar duas vezes. Dependendo da subquery, o banco faz uma consulta extra por linha do resultado da query principal. Se a principal tiver 100 linhas, são 101 consultas.

Tudo bem que não existe o tráfego de rede nem nada, existe a possibilidade de um cache da consulta e tudo mais.

Luis, não se assuste. Sua dúvida não é primitiva... no padrão SQL 2003 inventaram as funções ROW_NUMBER(), RANK() e DENSE_RANK() pra isso. Só vi isso no Microsoft SQL Server, no entanto.

Dá uma olhada nessa página que fala sobre como calcular ranks com MySQL:

http://rpbouman.blogspot.com/2009/09/mysql-another-ranking-trick.html

[]s

2009/10/26 Beatriz KMS <beatr...@gmail.com>

João Paulo Simões Cardoso

unread,
Oct 27, 2009, 9:47:16 AM10/27/09
to list...@googlegroups.com
Neste caso não será preciso acessar mais de uma vez

2009/10/26 Beatriz KMS <beatr...@gmail.com>

Laerte Mateus Rodrigues

unread,
Oct 27, 2009, 9:59:52 AM10/27/09
to list...@googlegroups.com
kra, cria uma coluna nova chamada posicao, e atualiza ela com uma
trigger, pelo q to vendo, vc qr fazer uma unica query d busca, entao
reduza o desempenho nos insert's e update's isso talvez t ajude
--
Grato

http://laertemateus.com

LuisRohden

unread,
Oct 27, 2009, 12:13:07 PM10/27/09
to LISTA PHP
Pois é, acho que talvez a solução do "tigre" (trigger) seja uma opção
bastante razoavel.
Vou analizar o número de vezes que sera necessário atualizar e tentar
implementar desta maneira.
Obrigado a sugestão de todos.

achei interessante as funções ROW_NUMBER(), RANK() e DENSE_RANK(), e
os artigos de referencia a solução da questão.
Pelo momento optarei pelo tigre.

João Paulo Simões Cardoso

unread,
Oct 27, 2009, 12:18:28 PM10/27/09
to list...@googlegroups.com
Ainda acho que o tratamento via código(PHP) seja melhor, mas tudo bem, vê o que é melhor pra ti.

Falou

2009/10/27 LuisRohden <luisr...@gmail.com>
Reply all
Reply to author
Forward
0 new messages