`

在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;


注意:以上语句在mysql4中只能执行:

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

不能执行:

set @mycnt = 0;
select * from (
    select (@mycnt := @mycnt + 1) as ROWNUM , othercol
     from tblname order by othercol
) as A where othercol=OneKeyID;

在mysql5中可以执行整条语句;

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

分享到:
评论

相关推荐

    MySQL中在查询结果集中得到记录行号的方法

    在MySQL中,获取查询结果集中记录的行号通常是一个需求,特别是在数据分析或处理分页时。虽然MySQL没有直接提供类似于SQL标准的ROW_NUMBER()或Oracle的ROWNUM函数,但是可以通过预定义用户变量来实现类似的功能。...

    MYSQL获取行号row_no

    在数据库操作中,有时候我们需要为查询结果集中的每一行添加一个行号(或行序号),类似于Oracle中的`ROW_NUMBER()`功能。然而MySQL并未直接提供与Oracle完全相同的功能,因此我们需要通过其他方式来实现这一需求。...

    oracle导出sql语句的结果集和保存执行的sql语句(深入分析)

    您可能感兴趣的文章:MySQL中在查询结果集中得到记录行号的方法PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解sql 查询记录数结果集某个区间内记录JavaWeb dbutils执行sql命令并遍历结

    mysql常用函数列表 (2).pdf

    22. `mysql_num_fields` / `mysql_num_rows`:返回结果集中的字段数量和行数,有助于了解查询结果的规模。 23. `mysql_query`:执行 SQL 查询,是 MySQL 函数库的核心。 24. `mysql_select_db`:选择要操作的...

    oracle rownum 的使用 和sqlserver有区别的!

    它在 Oracle 数据库中有着广泛的应用场景,尤其是在需要对查询结果进行分页显示、排序或者统计特定范围内的记录时尤为重要。本文将详细介绍 Oracle 中 ROWNUM 的使用方法,并与 SQL Server 中相应的功能进行对比分析...

    mysql cookbook

    - **1.15 在查询中使用 SQL 变量** - 说明如何在 SQL 查询中使用变量。 - **1.16 告诉 mysql 从文件读取查询** - 讲解如何让 mysql 从文件中读取查询语句。 - **1.17 从其他程序读取查询** - 指导如何让 mysql...

    php连接mysql代码

    在执行SQL查询后,如`SELECT`语句,`mysql_query()`函数会返回一个结果集。例如,以下代码查询名为`users`的表中的所有记录: ```php $query = "SELECT * FROM users"; $result = mysql_query($query, $connection)...

    MySql5.1 C API函数描述.doc

    `mysql_data_seek()`允许开发者在查询结果集中移动到特定的行。这对于分页查询或在大量数据中进行导航非常有帮助。通过提供一个行号作为偏移量,可以直接定位到结果集中的任意位置。 ### 10. `mysql_debug()` 在...

    oracle、mysql数据库分页

    - `ROWNUM`用于标识查询结果集中的行编号。 - `ROWNUM`在查询时自动递增,初始值为1。 **具体步骤:** 1. **创建一个嵌套查询**:首先执行一个子查询,该子查询返回所有需要的数据,并添加一个额外的`ROWNUM`列。 2...

    oracle mysql分页源码

    1. ROWNUM关键字:Oracle 中最基础的分页方式是通过ROWNUM伪列,它会为查询结果集中的每一行分配一个唯一的数字。例如,要获取第10到20条记录,可以使用如下SQL语句: ```sql SELECT * FROM ( SELECT a.*, ROWNUM ...

    mysql,mssql,oracle分页精典代码集锦

    - **解释**:使用 ROW_NUMBER 函数对结果集中的行进行编号,然后根据指定的起始行号和数量返回数据。 - **示例**:如果要从第 6 行开始返回 5 条记录,可以写为: ```sql SELECT TOP 5 * FROM (SELECT ROW_...

    如何获得以行号作为列的选定行?

    1. **窗口函数ROW_NUMBER()**: 这是SQL Server、Oracle、MySQL等数据库系统提供的一个功能,它可以在结果集中为每一行分配一个唯一的行号。在`ROW_NUMBER() OVER()`结构中,`OVER()`关键字定义了一个窗口,其中的...

    Mysql Limit 分页查询优化详解

    MySQL中的LIMIT子句常用于实现分页查询,它允许我们从结果集中选择特定数量的行。在处理大量数据时,不恰当的分页查询可能会导致性能下降,因为MySQL需要扫描和处理更多的行。本篇文章将深入探讨如何优化使用LIMIT...

    数据库分页查询语句

    `ROWNUM` 是 Oracle 自带的一个伪列,它会为结果集中的每一行分配一个唯一的行号。需要注意的是,`ROWNUM` 的值是从 1 开始递增的。 **SQL 示例**: ```sql SELECT * FROM ( SELECT a.*, ROWNUM AS rc FROM table...

    jsp分页技术 jsp servlet sqlserver

    在实际应用中,经常需要对查询结果进行分页显示,以提高用户体验并减轻服务器压力。分页的核心在于计算出当前页面需要展示的数据范围,并通过SQL查询语句获取这部分数据。 ### 二、JSP与Servlet结合实现分页 #### ...

    sql分页方法

    在Oracle中,实现分页主要依赖于`ROWNUM`伪列,该伪列用于标识查询结果集中的行编号。但是,直接使用`ROWNUM`有时会遇到性能问题,因此推荐使用`ROW_NUMBER()`窗口函数配合`PARTITION BY`和`ORDER BY`子句。然而,...

    php实现可用于mysql,mssql,pg数据库操作类

    在PHP编程中,操作数据库是一项基础且...同时,合理管理数据库连接和查询结果集的资源释放,避免内存泄漏。 通过本文所介绍的数据库操作类,开发者们能够更加便捷地进行数据库编程,构建更为稳定和高效的应用程序。

    分页查询sql

    `ROW_NUMBER()`函数是SQL Server提供的一个窗口函数,用于为结果集中的每一行分配一个唯一的数字。它可以与`OVER()`子句一起使用,以定义分配行号的方式。 - **基本语法**: ```sql ROW_NUMBER() OVER ( [ORDER ...

    从N行读到M行的数据sql语句

    - 行号是基于`paybefore`列降序排列的,即最新支付的记录将获得最小的行号。 - **外部查询**: `SELECT * FROM (...) AS nc WHERE nc.RowNumber > 20 AND nc.RowNumber - 外部查询使用内部查询的结果作为输入(`nc`...

Global site tag (gtag.js) - Google Analytics