如何获取行号?关键:自定义变量@rowNum:=0;
假设有这样的数据
mysql> select id,name from students;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
| 4 | trx |
| 5 | pjf |
| 6 | wzm |
+----+----------+
再看
mysql> SELECT @rowNum:=0;
+------------+
| @rowNum:=0 |
+------------+
| 0 |
+------------+
mysql> SELECT @rowNum:=1;
+------------+
| @rowNum:=1 |
+------------+
| 1 |
+------------+
SELECT @rowNum:=0; 表示声明了一个叫rowNum的变量并赋值为0,这个变量名是自定义的,在sql中我们可以对这个变量进行计算,如:
mysql> select (@rowNum:=@rowNum+1) as num from (SELECT @rowNum:=0) a;
+------+
| num |
+------+
| 1 |
+------+
mysql> select (@rowNum:=@rowNum+5) as num from (SELECT @rowNum:=0) a;
+------+
| num |
+------+
| 5 |
+------+
此时 (SELECT @rowNum:=0) a 相当于一个临时表,如果将它与students表进行连接将会得到:
mysql> select b.*,id,name from students a,(SELECT @rowNum:=0) b;
+------------+----+----------+
| @rowNum:=0 | id | name |
+------------+----+----------+
| 0 | 1 | zhangsan |
| 0 | 2 | lisi |
| 0 | 3 | wangwu |
| 0 | 4 | trx |
| 0 | 5 | pjf |
| 0 | 6 | wzm |
+------------+----+----------+
可以看到,b表只有一条数据,与a表连接后就有了a表的6条数据,如果我们对自定义变量@rowNum:进行+1操作,会有什么效果呢?
mysql> select (@rowNum:=@rowNum+1) as num,id,name from students a,(SELECT @rowNum:=0) b;
+------+----+----------+
| num | id | name |
+------+----+----------+
| 1 | 1 | zhangsan |
| 2 | 2 | lisi |
| 3 | 3 | wangwu |
| 4 | 4 | trx |
| 5 | 5 | pjf |
| 6 | 6 | wzm |
+------+----+----------+
6 rows in set (0.00 sec)
这就达到了查询结果带行号的目的,我们推演一下两个表连接的过程:
- 一开始自定义变量@rowNum:=0,a表第一条数据(1,'zhangsan')与自定义变量join,不过我们取的是@rowNum:=@rowNum+1,即0+1,那么最终就会得到(1,1,'zhangsan')
- 此时自定义变量@rowNum:=1,a表第一条数据(2,'lisi')与自定义变量join,即1+1,那么最终得到(2,2,'lisi')
- ....(以此类推)
由此,我们就能得到sql查询带行号的结果。