mysql中对总成绩进行排名_MYSQL成绩排名

今天在坛子上看到了,顺便写下来。

有两种方法:

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值