找到特定注册表的位置 - ranking / asp classic / mysql

时间:2011-04-22 21:43:19

标签: mysql

我的数据库中有一个包含多个表的表 记录。我需要知道如何确定在哪个位置 记录最近被放置,制作排名系统和 根据分数排名。

示例,我在数据库中有以下记录

user-01 / 100 points
user-02 / 88 points 
user-03 / 55 points 
user-04 / 11 points 
user-05 / 30 points 

有了这个,我想知道在哪个地方是用户03,这是第三个,我应该怎么做才能让系统向我展示这个位置?

谢谢!

2 个答案:

答案 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中的以下资源,它们提供了类似的解决方案。

querying for user's ranking in one-to-many tables

SQL ranking solution

PHP MYSQL query result "RANKING"