数据准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`score` float DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1001', '张三', '85');
INSERT INTO `user` VALUES ('1002', '李四', '91');
INSERT INTO `user` VALUES ('1003', '王五', '87');
INSERT INTO `user` VALUES ('1004', '赵六', '77');
INSERT INTO `user` VALUES ('1005', '冯七', '65');
INSERT INTO `user` VALUES ('1006', '陈八', '99');
INSERT INTO `user` VALUES ('1007', '楚九', '85');
INSERT INTO `user` VALUES ('1008', '魏十', '77');

查询添加行号

@xxx为变量,每条数据都可以进行操作

1
2
3
4
5
6
7
8
SELECT
(@rownumber :=@rownumber + 1) AS line, -- 每行进行+1,@rownumber没有默认值的话,就需要初始化
id,
name,
score
FROM
(SELECT * FROM user) c,
(SELECT @rownumber := 0) r; -- 初始化@rownumber 相当于在user上加了一列为@rownumber的数据

结果如下

分组添加行号

1
2
3
4
5
6
7
8
9
10
11
SELECT
@rownumber:=
CASE
WHEN @preScore = c.score THEN (@rownumber + 1) -- 相同时,就是+1,否则就是1
ELSE 1
END AS line, -- @rownumber默认值,所以不用初始化。
@preScore := c.score, -- 需要分组的数据,用于上面判断。
name,
score
FROM
(SELECT * FROM user ORDER BY user.score) c -- 数据必须是排序的,否则无法计数

结果如下