Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Hello!
Tenho uma tabela aonde insiro uma pontuação, até ai tudo bem.
Agora tenho que saber como posso saber em qual colocação determinada pontuação ficou, suponhamos que eu tenha a seguinte tabela
usuario01 - 9(pontos)
usuario02 - 4(pontos)
usuario03 - 1(pontos)
usuario04 - 5(pontos)
usuario05 - 7(pontos)
O dado em negrito é o último que foi inserido, eu gostaria de saber como eu faço para saber a colocação deste resultado levando em conta os outros dados, nesse exemplo o usuario05 esta na 2 colocação, mas como eu poderia saber isso utilizando o sistema?
Com toda certeza você não entendeu, o code não terá apenas estes 5 registros, com o tempo terá milhares, com isso impossível fazer isso com if, sem contar que com If seria a maneira mais podre de se fazer isso, tenho certeza que tem como fazer isso pelo code em conjunto com a query do BD, por isso sem condições com if.
Se alguém ai souber como fazer sem o uso de POG por favore diga-me.
você pode fazer direto na SQL, pegando atraves do SELECT MAX, e ordenando numericamente
Você não entendeu, SELECT Max... ordenando? mas assim eu colocaria os resultados em ordem, o que estou precisando é saber a colocação de determinado resultado, olhe no meu primeiro post, queria por exemplo pegar a colocação de determinado registro e não colocar em ordem.
------
Pessoas, estou ainda precisando, se alguém souber como fazer isso, diga-me please.
se você tiver um campo no banco de dados com a pontuação, simplesmente, faça a ordenação do maior, enetendeu....
seria a mesma lógica para você fazer a classificação , por exemplo do campeonato de futebol
dá uma olhada aqui, pode te ajudar
Sim, mas você não entendeu, eu não quero achar o maior ou menor, eu quero achar a colocação de determinado registro, ele pode esta em 2º, 3º, 6º, 10º ou 100º lugar.
Estou precisando resgatar a colocação de determinado registro, ou seja: apenas 1 registro e mostrar qual colocação ele esta, não estou querendo listar ou ordenar por colocação.
Caio, se você quiser a solução apenas em MySql acho que o pessoal do seu outro post http://forum.imasters.com.br/topic/431020-pegar-posicao-em-ranking-do-usuario/page__p__1701229#entry1701229 vai poder te ajudar melhor.
Caso não haja uma solução direto pelo select como você está buscando, além das sugestões do xanburzum, você pode:
- Resgatar todas as posições do banco ordenadas pela pontuação;
Nesse exemplo o resultado da contagem é a posição do que você está procurando.
É lógico que essa saída pode ser inviável dependendo da quantidade de registro no seu banco, mas se não houver outra... fica a tentativa de ajuda.
Cada um conhece seu sistema melhor que ninguém...
Abçs
existe um tópico de um simulador campeonato de futebol, onde existe os critérios de classificação, será a mesma lógica
David, pois é, estou em dúvidas se isso pode ser feito pela Query do sql ou terei que colocar code asp no meio, por isso postei esse aqui e aquele lá, mais vou aguardar o pessoal de lá se manifestar pois tenho quase certeza que isso da para se fazer diretamente da query.
Bom.. então vamos atrás da query...
Olha esse link... veja se te ajuda... pelo visto tem jeito pela query sim...
ta direto no mysql, mas deve ser possível adaptar para o que você precisa em asp
Se não conseguir adaptar, me dá um toque... eu tento aqui tb...
http://www.fromdual.com/ranking-mysql-results
abçss
olha esse aqui tb...
Hum, interessante, vou da uma olhada!
OBG.
ae mano... tava te devendo uma!
criei uma tabela no mysql assim:
CREATE TABLE `tb_pontuacao` (
`id_tb_pontuacao` int(11) NOT NULL AUTO_INCREMENT,
`nm_pessoa_tb_pontuacao` varchar(45) DEFAULT NULL,
`pontos_tb_pontuacao` int(11) DEFAULT NULL,
PRIMARY KEY (`id_tb_pontuacao`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1$$
<%
sql_consulta = "SELECT nm_pessoa_tb_pontuacao, pontos_tb_pontuacao, @rownum := @rownum + 1 AS rank FROM tb_pontuacao JOIN (SELECT @rownum := 0) rownum ORDER BY pontos_tb_pontuacao DESC"
set rs = cnx.execute(sql_consulta)
if not rs.eof then
While not rs.EOF
%>
Nome: <%response.Write(rs("nm_pessoa_tb_pontuacao"))%> | Pontuação: <%response.Write(rs("pontos_tb_pontuacao"))%> | Ranking: <%response.Write(rs("rank"))%> <br />
<%rs.MoveNext
Wend%>
<%end if%>
Resultado:
Nome: nome01 | Pontuação: 50 | Ranking: 1
Nome: nome03 | Pontuação: 45 | Ranking: 2
Nome: nome02 | Pontuação: 40 | Ranking: 3
Para saber a posição de determinado registro é só colocar um WHERE na query com o id da pessoa que você precisa... já era!
Qlqer coisa posta ae!!
abçs
E ai David, fico agradecido por me ajudar, valew.
No caso estou basicamente é precisando saber a posição de determinado registro, e nesse caso não consegui com sua instrução, utilizei da seguinte forma.
sql_consulta = "SELECT nm_pessoa_tb_pontuacao, pontos_tb_pontuacao, @rownum := @rownum + 1 AS rank FROM tb_pontuacao JOIN (SELECT @rownum := 0) rownum WHERE id = 1"
Mas não foi, ele sempre me retorna 1 como posição no rank, para todos os registros.
Agradeço se puder verificar e ver se estou fazendo certo.
putz.. tem razão... não me atentei à isso...
pelo que entendi, como ele cria uma pseudo coluna "rank" e adiciona +1 a cada posição, se ele trouxer apenas uma posição ela vai ser sempre a 1ª....
foi mal pelo alarme falso rsrs.. vou pesquisar de novo aqui...
rsrsrsrs no problems, o problema no meu caso é identificar a posição de um registro apenas, se for ordenar eu uso o
ORDER BY pontos_tb_pontuacao DESC
Somente ele já me retorna os results.
Mas a questão é a colocação de determinado registro, ai sim o bicho pega heheheh;
usandlo o exemplo do amigo David, você pode fazer assim:
sql_consulta = "select * from (SELECT id, nm_pessoa_tb_pontuacao, pontos_tb_pontuacao, @rownum := @rownum + 1 AS rank FROM tb_pontuacao JOIN (SELECT @rownum := 0) rownum)as tab WHERE id = 1"
lembrando que precisa adicionar o campo ID na tabela tb_pontuacao
E assim :
sql= "select * from tabela order by pontuacao"
set rs = con.execute(sql)
while not rs.eof
i = 1
response.write rs("nome") & rs("pontuacao") & i
i=i+1
loop
Algo assim, fiz o code meio por cima, mais para dar uma ideia, então deve ter alguns erros.
Ordenando pela pontuação o resultado num response.write seria primeiro o que tem mais pontos, e usando um contador (i) ele já exibe a posição do usuário na tabela.
Não Vinicios, eu preciso saber apenas o resultado de um registro que eu especificar, tipo... tem varios registro diferentes... com pontuações diferentes... dai tem registro de 1 a 700 e eu queria saber em que colocação estaria o registro com id 455 levando em conta os outros.
A questão não é saber qual é a menor ou maior, nem lista os resultados, a dúvida é saber a colocação de um único id independente de que colocação ele esta.
oi. nao funcionou o meu codigo?
olá fábio, não havia visto seu post rsrs, maus.
Mais não foi não mano, ele coloca a posição de acordo com o id, então sempre a esta dando a posição com o número do id que eu coloc no where, se eu colocar 1 vai mostrar 1, seu eu colocar 23 vai mostrar 23, se eu colocar 45 vai mostrar 45.
Mas de qualquer forma agradeço a ajuda.
Andei pesquisando pela net, e o resultado mais próximo que achei seria o que o Ocool no post #14 e fabio no post #17 indicaram.
Como voce disse que precisa saber qual a posição de um certo id num determinado select, talvez a solução seja fazer o select e dentro do loop ir comparando o id do registro atual com que desejado, e com um contador ir contando a posição até chegar no id desejado.
Mais ou menos assim:
select * from tabela order by pontuacao
...
idproc = (id a ser comparado)
cont = 1
while not rs.eof
if not idproc = rs("id") then
cont = cont+1
rs.movenext
else
response.write "posição" & cont
end if
...
Algo assim
Eu até havia pensado em algo semelhante, porém pela performance terei que fazer na query sql mesmo, pois o sistema terá milhares de registros acessado por milhares de pessoas, logo se eu fizer dessa maneira terei que percorrer e comparar todos os registro, portanto dessa maneira se torna inviável.
Agradeço a ajuda, valew pela força, vou continuar pesquisando pra ver se encontro algo, mais ta cabuloso rsrsr
Postei na seção MySQL e agora que vi, o mota me passou algo que seria possivel
http://forum.imasters.com.br/topic/431020-pegar-posicao-em-ranking-do-usuario/
Vo tentar, se alguém ai entender de MySQL e puder me ajudar seguindo a referencia que ele indicou, eu seria eternamente grato :D
Att. Caio
certo... quer trabalhar com performance, então a minha idéia é que esse campo RANK ele seja um campo fisico da tabela e ai você utiliza uma trigger para atualizar o RANK sempre que fizer update, delete ou insert na tabela.
assim o seu select tb estará pronto com um simples select * from tabela where id=1
abraços
Entendi, vou da uma procurara a respeito do trigger e ver se acho alguma solução.
Obrigado. :D
faça uma comparação qual o maior valor, você consegue atraves de um simples IF