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

作者:Alice 来源:赛迪网 时间:2008-12-17 15:00:00 

如果需要在查询语句返回的列中包含一列表示该条记录在整个结果集中的行号, 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 或其他语言脚本中对返回的整个结果集再作处理。

标签:
0
投稿

猜你喜欢

  • 区别Javascript中的Null与Undefined

    2007-12-13 20:24:00
  • 深入浅出SQL教程之SELECT语句的自连接

    2009-08-30 15:17:00
  • 常用的数据库备份类型有哪些?

    2009-11-01 13:02:00
  • HTML5 离线存储之Web SQL

    2011-06-19 14:13:19
  • asp如何实现页面延迟?

    2010-06-03 10:18:00
  • 打造“前端开发”程序员专用版EditPlus

    2009-01-05 13:04:00
  • js版sliderBar(滑动条)控件

    2008-10-18 15:59:00
  • 提高MySQL数据库查询效率的三个实用技巧

    2008-12-03 16:40:00
  • 带你深入了解数据库设计中的英文术语表

    2008-12-09 14:53:00
  • 处理HTML代码的若干函数

    2009-08-21 13:21:00
  • Mysql中日期和时间函数介绍

    2008-05-24 08:16:00
  • Dreamweaver量身打造Wordpress留言板(三)

    2009-12-13 18:45:00
  • ASP编程菜鸟易犯的一个错误

    2008-10-29 13:27:00
  • Oracle 函数大全

    2009-07-23 14:29:00
  • Dreamwaver 常见问答解答

    2009-07-05 18:51:00
  • mysql5在rhel5下乱码问题及解决方法

    2010-12-03 16:26:00
  • MySQL修改默认字符集

    2010-11-02 12:11:00
  • 月影:function扩展

    2008-05-19 12:27:00
  • 用Dreamweaver设计Wordpress留言板教程(一)

    2010-03-17 15:44:00
  • Ajax缓存和编码问题的最终解决方案

    2010-03-30 13:42:00
  • asp之家 网络编程 m.aspxhome.com