mysql查询结果显示行号
作用
有的时候查表出来的数据是有序排列的,我们需要知道某条数据在所有数据的第几行,或者想抽奖,选择第几行的某条数据,都需要行号来识别,只要是将数据与顺序关联在一起,行号这个会起到莫大的作用。
Oracle中的行号
在oracle获取记录行号使用rownum获取。
mysql中获取行号的方法
使用
select (@rownnum := @rownnum + 1) AS rownum,mobile from test,(SELECT @rownnum := 0) as rn limit 100;
与行号相关的只有两条数据
- 定义变量
(SELECT @rownnum := 0) as rn
- 获取行号
(@rownnum := @rownnum + 1) AS rownum
原理
- mysql中没有像oracle有可以显示行号的函数,但是可以通过设置变量的形式来动态获取行号
- mysql获取行号的原理就是,在查询语句中定义一个变量,在结果表中输出该变量,并且,该变量随行数的增加而变化。、
- 在以上sql语句中 (SELECT @rownnum := 0) as rn 就是定义了一个rownnum的变量,初始值为0,并将该变量存在rn这个临时表中,rownnum,rn变量名称可以自定义,可以随意叫,只要不跟mysql保留字一样就行。
- mysql中设置变量的方式有很多,我们需要将设置的变量设置为全局变量,并且可以输出到保存变量的表中,所以使用SELECT @rownnum := 0
- 接下来就是在结果表中,通过查询获取到该变量的值(@rownnum := @rownnum + 1) AS rownum,sql在执行该处时会先执行括号里面的变量赋值操作,之后才会将变量值输出到rownum字段中,这样每有一行行数就会加1.
一些问题
当使用group by字段时,会出现行号错误,或者最终表行号缺失等问题,这是因为mysql执行sql的顺序原因,在添加了行号之后最后才会对结果数据进行分组,所以就会出现有些行号不见了的情况,或行号错误。
解决方法
先不使用加行号的操作,将所有的查询语句查出来后,在在结果表的基础上添加行号。
select (@rownum := @rownum + 1) AS rownum,phone from
(SELECT phone FROM t_equity_new_receive WHERE equity_no='3000000003' AND receive_data<'20190731' GROUP BY create_time ) a,(SELECT
@rownum := 0) AS rn