MySQL rowrank基于两列上的ORDER BY

MySQL rowrank基于两列上的ORDER BY,mysql,sql,database,Mysql,Sql,Database,数据库中有表persons: id int points int voted_on int other columns 我想知道具有idx的行具有哪个行级别,具有相同点的行具有相同的行级别。这个查询工作得又快又好:(但是告诉我你是否知道更好的一个:) 但现在我想升级一个查询,即投票人数较少但分数相同的人比投票人数较多的人拥有更好的行排名。然而,拥有相同分数和投票权的人应该拥有相同的排名 您需要一个更复杂的where子句: select count(*) fr

数据库中有表
persons

id          int
points      int
voted_on    int 
other columns
我想知道具有
id
x的行具有哪个行级别,具有相同点的行具有相同的行级别。这个查询工作得又快又好:(但是告诉我你是否知道更好的一个:)


但现在我想升级一个查询,即投票人数较少但分数相同的人比投票人数较多的人拥有更好的行排名。然而,拥有相同分数和投票权的人应该拥有相同的排名

您需要一个更复杂的
where
子句:

select count(*)
from persons p cross join
     (select points, voted_on from persons p where p.id = x) const
where (p.points > const.points) or
      (p.points = const.points and p.voted_on >= const.voted_on)

我不确定“更好”是指级别更低还是更高。如果被投票的人数更大,这会给人更高的排名。对于较低的排名,请将
=
更改为
,非常感谢您的回答,但我更愿意给他们所有最高的行排名,上面的查询给所有3个最低的行排名。如果数据库中有6个人,而2到4个人的分数和投票数相同,那么如何给他们所有的排名2(而不是4)。再次感谢,对不起,我早该这么说的。您的查询是否需要(id,Vote_on)上的索引?感谢您的编辑,这很有魅力,最后一个问题:我需要一个额外的索引来加速它吗?目前只得到(id,点数)。@KevinVermaat。在
点上的索引,投票在
上可能会有帮助,在
id上的索引(对于子查询)也可能会有帮助。如果需要多个“x”的值,请询问另一个问题。这个问题可能有一个非常不同的解决方案。你建议的索引,那些是普通索引,或者你的意思是(p.id,points)和(p.id,p.voated_on)?这个查询背后的秘密是什么?它是如此之快,我不明白,(目前得到的是非综合指数)。
select count(*)
from persons p cross join
     (select points, voted_on from persons p where p.id = x) const
where (p.points > const.points) or
      (p.points = const.points and p.voted_on >= const.voted_on)
select count(*) + 1
from persons p cross join
     (select points, voted_on from persons p where p.id = x) const
where (p.points > const.points) or
      (p.points = const.points and p.voted_on > const.voted_on)