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

原理

  1. mysql中没有像oracle有可以显示行号的函数,但是可以通过设置变量的形式来动态获取行号
  2. mysql获取行号的原理就是,在查询语句中定义一个变量,在结果表中输出该变量,并且,该变量随行数的增加而变化。、
  3. 在以上sql语句中 (SELECT @rownnum := 0) as rn 就是定义了一个rownnum的变量,初始值为0,并将该变量存在rn这个临时表中,rownnum,rn变量名称可以自定义,可以随意叫,只要不跟mysql保留字一样就行。
  4. mysql中设置变量的方式有很多,我们需要将设置的变量设置为全局变量,并且可以输出到保存变量的表中,所以使用SELECT @rownnum := 0
  5. 接下来就是在结果表中,通过查询获取到该变量的值(@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