今天在坛子上看到了,顺便写下来。
有两种方法:
1、效率不高,因为有子查询。但是简洁。而且我对SOCRES表做了INDEX。所以性能上也差不了多少。
mysql> show create table scores\G *************************** 1. row *************************** Table: scores Create Table: CREATE TABLE `scores` ( `id` int(11) NOT NULL AUTO_INCREMENT, `score` int(11) DEFAULT '0', PRIMARY KEY (`id`), KEY `k_s` (`score`) ) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)
mysql> select count(1) from scores; +----------+ | count(1) | +----------+ | 1000000 | +----------+ 1 row in set (0.00 sec)
mysql> select id,score,(select count(1) from scores where score>= (select score from scores where id = 100 order by score desc limit 1)) as rank from scores whe re id = 100; +-----+-------+--------+ | id | score | rank | +-----+-------+--------+ | 100 | 64 | 370311 | +-----+-------+--------+ 1 row in set (1.05 sec)
2、分句完成。效率高。
存储过程:
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_rank`$$
CREATE PROCEDURE `test`.`sp_rank`(IN str_id int(11)) BEGIN -- user's score DECLARE str_score int; -- user's rank DECLARE rank int; select score from scores where id = str_id order by score desc limit 1 into str_score ; select count(*) from scores where score >=str_score into rank; -- output select id,score,rank from scores where id = str_id; END$$
DELIMITER ;
mysql> call sp_rank(100); +-----+-------+--------+ | id | score | rank | +-----+-------+--------+ | 100 | 64 | 370311 | +-----+-------+--------+ 1 row in set (1.02 sec)
Query OK, 0 rows affected (1.02 sec)
本文出自 “” 博客,转载请与作者联系!