数据库有表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的人应具有相同的行级别。
答案 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”。