如何在MySQL查询结果集中得到记录行号

数据库 MySQL
MySQL查询是数据库操作过程中比较重要的一个环节,数据库的查询也是数据库功能性好的一个体现,那么如何在如何在MySQL查询结果集中得到记录行号呢?

如果需要在查询语句返回的列中包含一列表示该条记录在整个结果集中的行号, ISO SQL:2003 标准提出的方法是提供 ROW_NUMBER() / RANK() 函数。 Oracle 中可以使用标准方法(8i版本以上),也可以使用非标准的 ROWNUM ; MS SQL Server 则在 2005 版本中提供了 ROW_NUMBER() 函数;但在 MySQL 中似乎还没有这样的系统自带功能。虽然 LIMIT 可以很方便的对返回的结果集数量和位置进行过滤,但过滤出来的记录的行号却没办法被 SELECT 到。据说 MySQL 是早就想增加这个功能了,但我是还没找到。

解决方法是通过预定义用户变量来实现:

set @mycnt = 0;

select (@mycnt := @mycnt + 1) as ROWNUM , othercol from tblname order by othercol;

这样查询出来的结果集中 ROWNUM 就保存了行编号信息。这个行编号信息的某种用途在于当你需要根据需要对数据按照某种规则排序并取出排序之后的某一行数据,并且希望知道这行数据在之前排序中的位置时就用得着了。比如:

set @mycnt = 0;

select * from (

select (@mycnt := @mycnt + 1) as ROWNUM , othercol

from tblname order by othercol

) as A where othercol=OneKeyID;

当然你也可以通过创建临时表的方法把查询结果写到某个拥有 auto_increment 字段的临时表中再做查询,但考虑到临时表在 MySQL master / slave 模式下可能产生的问题,用这样临时用户定义变量的方式来计算查询结果集每一行对应的行号还是更为简洁 -- 除非你愿意在 PHP 或其他语言脚本中对返回的整个结果集再作处理。

【编辑推荐】
 

  1. 在SUSE10环境下安装和配置MySQL数据库
  2. 对抗MySQL数据库解密高手
  3. 一种特别简单的MySQL数据库安装方法
责任编辑:迎迎 来源: 赛迪网
相关推荐

2010-11-25 15:36:09

MySQL查询结果集

2010-11-09 12:20:53

SQL Server查

2010-11-25 11:57:42

MySQL查询行号

2010-11-25 11:51:53

MySQL查询行号

2011-05-05 11:12:11

EFSQL

2009-02-16 18:27:09

2010-11-25 14:45:19

MySQL查询结果

2010-06-10 17:59:05

2009-04-29 16:05:23

Oracle连接输出SQL

2010-11-25 14:05:15

MySQL查询中间记录

2023-05-26 15:46:23

数据结构布隆过滤器开发

2010-11-25 13:56:30

MySQL查询结果

2010-11-25 15:43:02

MYSQL查询重复记录

2018-11-05 14:53:14

Go函数代码

2020-09-30 06:49:25

MySQL查询删除

2010-05-27 17:16:20

MySQL数据库

2020-09-08 08:44:36

日志记录基础设施安全漏洞

2009-11-24 19:40:07

PHP关联数组查询结果

2010-05-31 16:46:40

2010-10-13 16:59:28

mysql查询
点赞
收藏

51CTO技术栈公众号