MySQL基于2列的ORDER BY rowrank

时间:2013-06-05 17:48:21

标签: mysql sql database

数据库有表persons

id          int
points      int
voted_on    int 
other columns

我想知道具有id x的行的哪一行排名,具有相同点的行具有相同的行排名。这个查询工作得很好而且很快:(但是告诉我,如果你知道更好的一个:)

select count(*)
from persons p cross join
     (select points from persons p where p.id = x) const
where p.points > const.points;

但是现在我想升级一个查询,即那些投票数较少但分数相同的人排名比排名较多的人排名更高。但是,具有相同点数和voted_on的人应具有相同的行级别。

1 个答案:

答案 0 :(得分:1)

您需要更复杂的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)

我不确定“更好”是指较低等级还是较高等级。如果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)

这将使排名开始于“1”而不是“0”。