MySQL查询结果集中得到记录行号的实现

数据库 MySQL
我们可以通过预定义用户变量来实现在MySQL查询结果集中得到记录行号,下文对该方法作了比较详细的分析,供您参考。

如果要在MySQL查询结果集中得到记录行号,应该如何实现呢?下面就为您介绍一个MySQL查询结果集中得到记录行号的方法,希望对您能有所启迪。

在计算某特定记录在查询结果中的位置用到。

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

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

  1. set @mycnt = 0;   
  2.  
  3. select (@mycnt := @mycnt 1) as ROWNUM , othercol from tblname order by othercol;   
  4.  

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

  1. set @mycnt = 0;   
  2.  
  3. select * from (   
  4.  
  5. select (@mycnt := @mycnt 1) as ROWNUM , othercol   
  6.  
  7. from tblname order by othercol   
  8.  
  9. ) as A where othercol=OneKeyID;   
  10.  

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

 

【编辑推荐】

MySQL随机查询的实现方法

MySQL查询分页的优化

用变量实现MySQL查询行号

MySQL查询结果按某值排序

MySQL查询中的非空问题

责任编辑:段燃 来源: 互联网
相关推荐

2011-04-06 10:53:36

MySQL

2010-11-25 11:51:53

MySQL查询行号

2010-11-25 11:57:42

MySQL查询行号

2010-11-09 12:20:53

SQL Server查

2010-10-13 16:59:28

mysql查询

2010-11-25 14:05:15

MySQL查询中间记录

2010-11-25 15:43:02

MYSQL查询重复记录

2010-11-25 14:45:19

MySQL查询结果

2010-06-10 17:59:05

2010-11-22 15:56:34

Mysql多表查询

2010-10-14 14:28:03

Mysql多表查询

2010-11-25 15:30:15

MySQL查询结果

2010-11-25 13:56:30

MySQL查询结果

2011-05-05 11:12:11

EFSQL

2010-11-25 14:52:35

MySQL随机查询

2010-10-15 11:05:31

MYSQL查询结果

2010-11-25 14:40:27

MySQL查询

2009-11-13 10:12:03

2011-08-11 11:51:39

MySQLselect

2010-12-21 09:47:45

SQL Server
点赞
收藏

51CTO技术栈公众号