Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql根据级别描述和经验描述计算排名_Mysql_Sql - Fatal编程技术网

Mysql根据级别描述和经验描述计算排名

Mysql根据级别描述和经验描述计算排名,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

基本上,我有一个名为hiscores的表,我想在其中搜索一个用户的昵称并获取他的当前排名,因为排名rown不存在,因为排名是由lvl DESC组织的,然后是由经验组织的,所以我想要一个sql查询,在这里我搜索该用户的名称 “玩家1”让我感觉排名2。或者输入healdeal并获得排名1

 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?