0

我正在运行一个CodeIgniter为游戏运行后端,其中用户信息和高分表保存在数据库中。每个用户只能以个人最好成绩进入高分,因此每个用户只有一个条目

现在我需要为客户导出该数据,以便他可以随机选择获胜者。基本上我想给他所有的用户数据加上用户积分和他在高分表中的位置。

我在弄清楚如何在高分表中获得位置时遇到问题。

假设我的用户表看起来像这样

user_table
| id|name|
|...| ...|

highscore_table
|id |user_id|points|
|...|  ...  |  ... |

SQL语句,不包括高分位置,看起来像这样

SELECT user_table.id, name, points
FROM user_table
INNER JOIN highscore_table ON user_table.id = highscore_table.user_id
ORDER BY name

导出的数据应如下所示

|id | name|points|hs_position|
|...| ... |  ... |    ...    |

通常,当我请求高分时,我会做类似的事情,但对数据进行排序points. 这不是一个选择。

有人可以告诉我如何实现这一目标,引导我朝着正确的方向前进,还是简单明了地告诉我这是不可能的?

任何帮助是极大的赞赏。

4

3 回答 3

2

我在弄清楚如何在高分表中获得位置时遇到问题。

如果您使用的是 SQL-Server,您可以使用DENSE_RANKHS-Rank 并ROW_NUMBER获取每个用户最高点的行:

WITH cte 
     AS (SELECT user_table.id, 
                name, 
                points, 
                hs_position=Dense_rank() 
                              OVER( 
                                ORDER BY points DESC), 
                Personalbest_Num=Row_number() 
                                   OVER( 
                                     partition BY id 
                                     ORDER BY points DESC) 
         FROM   user_table 
                INNER JOIN highscore_table 
                        ON user_table.id = highscore_table.user_id) 
SELECT id, 
       name, 
       points, 
       hs_position 
FROM   cte 
WHERE  personalbest_num = 1 
ORDER  BY hs_position ASC, 
          name ASC
于 2013-04-17T09:19:41.757 回答
1

如果您使用的 RDBMS 不支持排名函数(例如 SQLite),那么实现此目的的一种方法是通过子查询 - 如下所示:

SELECT u.id, u.name, h.points, 
       (select count(*) + 1
        from highscore_table h2 
        WHERE h2.points > h.points) hs_position
FROM user_table u
INNER JOIN highscore_table h ON u.id = h.user_id
ORDER BY u.name

SQLFiddle在这里

(如果您想要一个密集排名的高分,请更改count(*) + 1count(distinct h2.points) + 1。)

于 2013-04-17T09:38:07.623 回答
0

这是 MySQL 的解决方案:

SELECT user_table.id, name, points, hs_table.rank
FROM user_table
INNER JOIN 
(
  SELECT hs.*, IF(@prev != points, @pos:=@pos + 1, @pos) as rank
  , @prev:=points
  FROM highscore_table hs,
       (SELECT @pos:=0, @prev:=NULL) vars
  ORDER BY points DESC
) hs_table
 ON user_table.id = hs_table.user_id
ORDER BY name

拥有相同分数的人将获得相同的排名。

于 2013-04-17T09:27:54.373 回答