我的数据库中有一个包含多个表的表 记录。我需要知道如何确定在哪个位置 记录最近被放置,制作排名系统和 根据分数排名。
示例,我在数据库中有以下记录
user-01 / 100 points
user-02 / 88 points
user-03 / 55 points
user-04 / 11 points
user-05 / 30 points
有了这个,我想知道在哪个地方是用户03,这是第三个,我应该怎么做才能让系统向我展示这个位置?
谢谢!
答案 0 :(得分:1)
您可以在结果集中创建行号列。要将变量JOIN
初始化为只将变量设置为0的伪表,否则您必须事先SET
- 需要额外的声明。
演示:
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)
答案 1 :(得分:0)
我遇到了类似的问题但是这个“user-03”类行重复了多次。而且我还在使用两张桌子。
表格结构:
得分表[得分浮点数,uid int,时间戳日期时间] 用户表[用户名varchar(500),id int等...]
排名标准是根据最高分数列出用户。所以我在sql查询中使用 group by 和 JOIN 修改了查询,如下所示。
排名系统。
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
要识别单个行的位置及其在db上的排名,请使用以下查询。
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'
另请参阅stackoverflow中的以下资源,它们提供了类似的解决方案。