Eu tenho uma tabela no meu banco de dados contendo vários registros. Eu preciso saber como identificar em qual posição registro foi recentemente colocado, fazer um sistema de ranking e um posição de acordo com a pontuação.
Exemplo, eu tenho os seguintes registros no banco de dados
user-01 / 100 points
user-02 / 88 points
user-03 / 55 points
user-04 / 11 points
user-05 / 30 points
Com isso eu gostaria de saber em qual lugar é usuário-03, aqui é o terceiro, o que devo fazer para o sistema me mostrar esse posicionamento?
Obrigado!
Respostas:
1 para resposta № 1Você pode criar uma coluna de número de linha no seu conjunto de resultados. Para inicializar a variável, JOIN
para uma pseudo-tabela que apenas define sua variável para 0 - caso contrário, você teria que SET
de antemão - exigindo uma declaração extra.
Para demonstrar:
mysql> CREATE TABLE scores (user VARCHAR(10), score INT);
Query OK, 0 rows affected (0.08 sec)
mysql> INSERT INTO scores
-> VALUES ("user1", 10),
-> ("user2", 20),
-> ("user3", 30);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT user, score, @rownum := @rownum + 1 AS rank
-> FROM scores
-> JOIN (SELECT @rownum := 0) rownum
-> ORDER BY score DESC;
+-------+-------+------+
| user | score | rank |
+-------+-------+------+
| user3 | 30 | 1 |
| user2 | 20 | 2 |
| user1 | 10 | 3 |
+-------+-------+------+
3 rows in set (0.00 sec)
0 para resposta № 2
Eu tive um problema semelhante, mas estava tendo esse tipo de linha "user-03" repetindo várias vezes. E também eu estava usando duas tabelas.
Estrutura das tabelas:
Tabela de pontuação [score float, uid int, timestamp datetime] Tabela de Usuários [username varchar (500), id int, etc ...]
O critério para classificação foi listar os usuários com base nas pontuações máximas. Então modifiquei a consulta usando grupo por e JUNTE-SE na consulta sql conforme indicado abaixo.
Sistema de Ranking.
SELECT *, @rownum:=@rownum+1 as rank
FROM (
select MAX(s.score) as score,u.username as username
from scorelog s join userdb u on s.uid=u.id
group by s.uid
order by MAX(s.score) desc
) user_rank, (SELECT @rownum:=0) r
Para identificar a posição da linha individual e sua classificação no banco de dados, use a consulta abaixo. o
SELECT *
FROM ( SELECT *, @rownum:=@rownum+1 as rank
FROM (
select MAX(s.score) as score,
u.username as username,
s.uid as uid,s.
timestamp as timestamp
from scorelog s join userdb u on s.uid=u.id
group by s.uid order by MAX(s.score) desc
) user_rank, (SELECT @rownum:=0) r
)t where username = "johndoe"
Consulte também os recursos abaixo de stackoverflow, que fornecem uma solução semelhante.
consultando a classificação do usuário em tabelas um-para-muitos
Resultado da consulta PHP MYSQL "RANKING"