我创建了一个测试表来模拟聚合标记的内部选择.然后,允许按列顺序切换,我尝试简单地使用您的方法,因为您已经在查询中使用变量.
SELECT std_login_id AS ID, STD_NAME,
(@rnk := IF(@track = TOTAL_MARKS , @rnk, @rnk + 1)) AS RANK,
(@track:= TOTAL_MARKS) as TOTAL_MARKS
FROM ( select *
from testtable
ORDER BY total_marks DESC) ob
CROSS JOIN (SELECT @rnk := 0, @track := 0) AS starter;
我相信这会产生你想要的东西.可能有更好的方法,但现在已经很晚了,所以我会选择它. 🙂
如果您想快速测试,只需粘贴并转到:
create table testtable (
std_login_id int(11) primary key auto_increment,
total_marks int(11),
std_name varchar(10)
);
insert into testtable (total_marks,std_name) values (10,'name1');
insert into testtable (total_marks,std_name) values (15,'name2');
insert into testtable (total_marks,std_name) values (15,'name3');
insert into testtable (total_marks,std_name) values (40,'name4');
insert into testtable (total_marks,std_name) values (50,'name5');
insert into testtable (total_marks,std_name) values (15,'name6');
insert into testtable (total_marks,std_name) values (10,'name7');
insert into testtable (total_marks,std_name) values (20,'name8');
insert into testtable (total_marks,std_name) values (10,'name9');
insert into testtable (total_marks,std_name) values (10,'name10');
insert into testtable (total_marks,std_name) values (50,'name11');
insert into testtable (total_marks,std_name) values (10,'name12');
insert into testtable (total_marks,std_name) values (25,'name13');
insert into testtable (total_marks,std_name) values (10,'name14');
insert into testtable (total_marks,std_name) values (50,'name15');
insert into testtable (total_marks,std_name) values (10,'name16');
insert into testtable (total_marks,std_name) values (50,'name17');
insert into testtable (total_marks,std_name) values (20,'name18');
insert into testtable (total_marks,std_name) values (40,'name19');
insert into testtable (total_marks,std_name) values (30,'name20');