Mysql 计算查询中的行号

Mysql 计算查询中的行号,mysql,sql,Mysql,Sql,我有一个用户统计表。为了简单起见,它如下所示: id nick kills deaths 1 Misiek 25 20 2 Astma 22 18 3 4i60r 20 32 4 Heatseeker 45 45 为了显示需要查询的内容,我准备了工作SQL查询: SELECT COUNT(id)+1 as `rank` FROM (SELECT * FROM (SELECT *, (k

我有一个用户统计表。为了简单起见,它如下所示:

id nick kills deaths 1 Misiek 25 20 2 Astma 22 18 3 4i60r 20 32 4 Heatseeker 45 45 为了显示需要查询的内容,我准备了工作SQL查询:

SELECT COUNT(id)+1 as `rank` FROM (SELECT * FROM (SELECT *, (kills/deaths) as kdr FROM `killerzy`) as b WHERE kdr > (SELECT (kills/deaths) as kdr FROM `killerzy` WHERE nick="4i60r")) as test 此查询的结果是:

rank 4 为了显示如何计算kdr,我使用了:

SELECT *, (kills/deaths) as kdr FROM `killerzy` WHERE 1 它产生:

id nick kills deaths kdr 1 Misiek 25 20 1.2500 2 Astma 22 18 1.2222 3 4i60r 20 32 0.6250 4 Heatseeker 45 45 1.0000 问题 我的问题是:mysql或postgresql数据库是否有现成的函数,可以在不编写3个嵌套查询的情况下为player获取“排名”?我想到的是:

SELECT ROW_NUMBER() FROM (SELECT (kills/deaths) as kdr FROM killerzy ORDER BY kdr DESC) WHERE nick = "4i60r" 它看起来比3个嵌套查询更符合逻辑

我知道这么简单的问题很难理解。这里是另一个版本:MySQL或PostgreSQL是否有函数可以返回我需要的resultset中哪个位置是行。比如在哪里得到位置。
奇怪的是,我的问题被搁置了,因为有人得到了答案,答案很好——简单的连接查询看起来很好,执行速度也很快。

您似乎想要的是一个简单的排名查询。在MySQL的情况下,它会是这样的

SELECT *, (kills/deaths) kdr, @rank := @rank + 1 rank 
FROM `killerzy`, (SELECT @rank := 0) r 
ORDER BY kdr DESC
在PostgreSQL中,您可以简单地使用RANK OVER

不幸的是,SQLfiddle似乎很累,所以无法添加小提琴

编辑:对于单个玩家,你可以用左键连接


您似乎想要的是一个简单的排名查询。在MySQL的情况下,它会是这样的

SELECT *, (kills/deaths) kdr, @rank := @rank + 1 rank 
FROM `killerzy`, (SELECT @rank := 0) r 
ORDER BY kdr DESC
在PostgreSQL中,您可以简单地使用RANK OVER

不幸的是,SQLfiddle似乎很累,所以无法添加小提琴

编辑:对于单个玩家,你可以用左键连接


你们的问题是…?其他人理解,但我添加了明确的问题。你们的问题是…?其他人理解,但我添加了明确的问题。但这是为了所有人。我只需要一个玩家的结果,就可以在玩家加入时在游戏中显示出来。@Misiek也添加了一个MySQL版本的结果。最后一个查询很有魅力,看起来很不错。但它适用于所有玩家。我只需要一个玩家的结果就可以在玩家加入时在游戏中显示。@Misiek也添加了一个MySQL版本。最后一个查询很有魅力,看起来不错。
SELECT me.*, me.kills/me.deaths kdr, 1+COUNT(other.id) rank 
FROM killerzy me 
LEFT JOIN killerzy other 
  ON me.kills/me.deaths < other.kills/other.deaths 
WHERE me.nick='4i60r';