为了账号安全,请及时绑定邮箱和手机立即绑定

mysql中实现排名,求解,看不懂

mysql中实现排名,求解,看不懂

慕粉3231078 2016-08-03 21:39:10
select sc.*, (   select count(1) from Score where cid = sc.cid and score > sc.score) + 1 as px  from Score as sc order by sc.cid, px; 求解,这段代码中是怎么实现的排序功能,子查询看不懂,能否详细解析下,谢谢啊
查看完整描述

1 回答

已采纳
?
qq_章鱼高_03773279

TA贡献1条经验 获得超1个赞

select sc.*, (
-- 子查询的意思是在score表中找出与当前记录cid相同,但score大于当前记录的score(sc.score)的数目+1。
-- 那样的话:如果是0, 则证明该条记录是表示的是该班的第一名,如果是1,在表示该班的第二名,以此类推。
  select count(*) from Score  as a where a.cid = sc.cid and a.score > sc.score
-- 所以后面加了个1
) +1  as px
from Score as sc order by sc.cid, px;

做了个测试:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cid` int(11) DEFAULT NULL,
  `score` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES ('1', '1', '80');
INSERT INTO `score` VALUES ('2', '1', '70');
INSERT INTO `score` VALUES ('3', '1', '90');
INSERT INTO `score` VALUES ('4', '2', '80');
INSERT INTO `score` VALUES ('5', '3', '70');
INSERT INTO `score` VALUES ('6', '3', '60');
INSERT INTO `score` VALUES ('7', '2', '50');

运行上面的sql查询,结果是:

mysql> select sc.*, (
    ->   select count(*) from Score where cid = sc.cid and score > sc.score
    -> ) + 1 as px
    -> from Score as sc order by sc.cid, px;
+----+------+-------+------+
| id | cid  | score | px   |
+----+------+-------+------+
|  3 |    1 |    90 |    1 |
|  1 |    1 |    80 |    2 |
|  2 |    1 |    70 |    3 |
|  4 |    2 |    80 |    1 |
|  7 |    2 |    50 |    2 |
|  5 |    3 |    70 |    1 |
|  6 |    3 |    60 |    2 |
+----+------+-------+------+
7 rows in set (0.00 sec)


查看完整回答
1 反对 回复 2016-08-04
  • 1 回答
  • 0 关注
  • 1263 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信