Sql 在第二个表中具有位置的内部联接

Sql 在第二个表中具有位置的内部联接,sql,inner-join,Sql,Inner Join,我正在运行一个游戏的CodeIgniter后端,其中用户信息和高分表保存在数据库中。每个用户只能输入个人最好成绩的高分,因此每个用户只有一个条目 现在我需要为客户导出这些数据,这样他就可以随机选择一个赢家。 基本上我想给他所有的用户数据加上用户分数和他在高分表中的位置 我很难弄清楚如何在高分榜上占据一席之地 假设我的用户表如下所示 user_table | id|name| |...| ...| highscore_table |id |user_id|points| |...| ...

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

现在我需要为客户导出这些数据,这样他就可以随机选择一个赢家。 基本上我想给他所有的用户数据加上用户分数和他在高分表中的位置

我很难弄清楚如何在高分榜上占据一席之地

假设我的用户表如下所示

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

highscore_table
|id |user_id|points|
|...|  ...  |  ... |
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|
|...| ... |  ... |    ...    |
SQL语句(不包括highscore位置)如下所示

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

highscore_table
|id |user_id|points|
|...|  ...  |  ... |
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|
|...| ... |  ... |    ...    |
导出的数据应该如下所示

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

highscore_table
|id |user_id|points|
|...|  ...  |  ... |
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|
|...| ... |  ... |    ...    |
通常,当我请求高分时,我会做类似的事情,但会按
点对数据进行排序。这不是一个选择

有人能告诉我如何做到这一点,引导我走向正确的方向,或者简单明了地告诉我这是不可能的吗

非常感谢您的帮助

我很难弄清楚如何在公司里得到这个职位 高分表

如果您使用的是SQL Server,则可以对HS排名使用
densite\u RANK
,并使用
ROW\u 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
我很难弄清楚如何在公司里得到这个职位 高分表

如果您使用的是SQL Server,则可以对HS排名使用
densite\u RANK
,并使用
ROW\u 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

这是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

拥有相同点数的人将拥有相同的排名。

这是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

拥有相同点数的人将拥有相同的排名。

如果您使用的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(*)+1
更改为
count(distinct h2.points)+1

如果您使用的是不支持排名函数(如SQLite)的RDBMS,那么实现这一点的一种方法是通过子查询,如:

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(*)+1
更改为
count(不同的h2.points)+1

你想做什么?我认为stackoverflow应该添加
一个建议,说明你没有添加你正在使用的RDBMS
?当一个问题被标记在sql或数据库标记中时?对不起,各位,遗漏了重要信息。这是一个MySQL数据库,我不能按点排序,因为用户的信息比我上面使用的要多得多,而且客户端对导出的数据的外观有明确的期望。您想做什么?我认为stackoverflow应该添加
一个建议,说明您缺少添加您正在使用的哪些RDBMS
?当一个问题被标记在sql或数据库标记中时?对不起,各位,遗漏了重要信息。这是一个MySQL数据库,我不能按点排序,因为用户的信息比我上面使用的要多,而且客户端对导出数据的外观有明确的期望。