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)
添加回答
举报
0/150
提交
取消
