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数据库,我不能按点排序,因为用户的信息比我上面使用的要多,而且客户端对导出数据的外观有明确的期望。