Mysql根据级别描述和经验描述计算排名
基本上,我有一个名为hiscores的表,我想在其中搜索一个用户的昵称并获取他的当前排名,因为排名rown不存在,因为排名是由lvl DESC组织的,然后是由经验组织的,所以我想要一个sql查询,在这里我搜索该用户的名称 “玩家1”让我感觉排名2。或者输入healdeal并获得排名1Mysql根据级别描述和经验描述计算排名,mysql,sql,Mysql,Sql,基本上,我有一个名为hiscores的表,我想在其中搜索一个用户的昵称并获取他的当前排名,因为排名rown不存在,因为排名是由lvl DESC组织的,然后是由经验组织的,所以我想要一个sql查询,在这里我搜索该用户的名称 “玩家1”让我感觉排名2。或者输入healdeal并获得排名1 Table = hiscores id - nickname- lvl - experience 1 - healdeal - 99 - 1000 2 - philip - 98
Table = hiscores
id - nickname- lvl - experience
1 - healdeal - 99 - 1000
2 - philip - 98 - 595
3 - Player1 - 98 - 620
4 - Mindblow - 52 - 35
我试过以下方法
SELECT (COUNT(*) + 1) AS rank FROM hiscores WHERE lvl >(SELECT lvl FROM hiscores WHERE nickname="player1")
我明白了。您正在尝试计算排名。我认为这可能会做到:
select count(*) as rank
from hiscores hs cross join
(select hs.*
from hiscores
where nickname = 'player1'
) hs1
where hs.lvl > hs1.lvl or
hs.lvl = hs1.lvl and hs.experience >= hs1.experience;
实际上,如果您在体验
和lvl
方面都有联系,那么这可能是一个更好的排名:
select 1 + count(*) as rank
from hiscores hs cross join
(select hs.*
from hiscores
where nickname = 'player1'
) hs1
where hs.lvl > hs1.lvl or
hs.lvl = hs1.lvl and hs.experience > hs1.experience;
如果您使用的是MSSQL 2005+。您可以这样做: 测试数据:
DECLARE @tbl TABLE(id INT,nickname VARCHAR(100),lvl INT, experience INT)
INSERT INTO @tbl
VALUES
(1 ,'healdeal',99,1000),
(2 ,'philip',98,595),
(3 ,'Player1',98,620),
(4 ,'Mindblow',52,35)
查询
;WITH CTE
AS
(
SELECT
RANK() OVER(ORDER BY lvl DESC,experience DESC) AS rank,
tbl.*
FROM
@tbl AS tbl
)
SELECT
*
FROM
CTE
WHERE
CTE.nickname='Player1'
输出
2 3 Player1 98 620
假设这是MySQL,这将起作用:
select @rownum:=@rownum+1 Rank,
h.*
from hiscores h,
(SELECT @rownum:=0) r
order by level desc, experience desc
如果这是MS SQL Server 2005以后的版本,则可以直接使用窗口函数,如下所示:
select *, rank() over (order by level desc, experience desc) Rank
from hiscores
在这两种情况下,如果您想按昵称过滤,您可以将上述表达式放入子查询中,并按昵称过滤,即
select * from
(<ranking expression from above>) rankedresults
where nickname = <input>
从中选择*
()rankedresults
其中昵称=
这是MySQL还是MS-SQL?