让我们直接进入我的问题并想象我们有这个简单的表
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`score` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `test` (`id`, `score`)
VALUES
(1, 10),
(2, 15),
(3, 6),
(4, 17);
我想做的是以下内容。我想按分数排序,然后获得ID为3的字段的排名
由于ID 3的条目得分最低,因此排名为4。
我有这个查询,以按分数排序
SELECT @rownum:=@rownum+1 rank, id, score from test t, (SELECT @rownum:=0) r ORDER BY score DESC;
结果如下
rank || id || score
1 4 17
2 2 15
3 1 10
4 3 6
但是,我想要达到的目的是立即获得排名。没有其他值的排名和结果。我不能只添加WHERE CLAUSE
,条件是ID
应为3,因为如果我这样做,则排名始终为1,因为查询只匹配数据库中的一个条目。
如果不以某种方式对结果进行迭代,我将如何直接获得排名?
答案 0 :(得分:2)
为什么不计算有多少比你想要的等级更好?
例如,对于id 3:
SELECT count(*)+1 FROM test where score > (SELECT score from test WHERE id = 3))
只需更改子查询末尾的id即可获得另一个id的等级
答案 1 :(得分:1)
为分数列添加索引并使用以下查询 -
select count(*) from test a join test b on a.score > b.score where a.id =3