如题:SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY emp.c_uid ASC) AS RowID, emp.c_uid, emp.c_name_c, emp.c_name_e, emp.c_user_type,emp.i_status,emp.d_create FROM tbl_user emp) as list WHERE RowID between (1-1) * 10 + 1 and 1*10    select count(*) from (SELECT ROW_NUMBER() OVER (ORDER BY emp.c_uid ASC) AS RowID, emp.c_uid, emp.c_name_c, emp.c_name_e, emp.c_user_type,emp.i_status,emp.d_create FROM tbl_user emp) as tmp我有段这这样的SQL代码,但是在MYSQL中不支持 ROW_NUMBER(),请问在MYSQL中有什么方法可以替代????

解决方案 »

  1.   

    select * 
    from tb
    limit  X,Y
      

  2.   

    MySQL中的ROWNUM的实现 
    http://blog.csdn.net/ACMAIN_CHM/archive/2009/04/20/4095531.aspx
      

  3.   

    mysql> create table tb(name varchar(30),age int);
    Query OK, 0 rows affected (1.27 sec)mysql> insert tb
        -> select 'A',18 union all
        -> select 'B',19 union all
        -> select 'C',22 union all
        -> select 'D',17;
    Query OK, 4 rows affected (1.34 sec)
    Records: 4  Duplicates: 0  Warnings: 0mysql> set @mycnt = 0; 
    Query OK, 0 rows affected (0.00 sec)mysql> select * from ( 
        ->     select (@mycnt := @mycnt + 1) as ROWNUM,name,age
        ->      from tb where AGe < 20 order by name,age 
        -> ) as A; 
    +--------+------+------+
    | ROWNUM | name | age  |
    +--------+------+------+
    |      1 | A    |   18 | 
    |      2 | B    |   19 | 
    |      3 | D    |   17 | 
    +--------+------+------+
    3 rows in set (0.00 sec)
      

  4.   

    楼主的要求恐怕不是简单的ROW_NUMBER(),你的SQL是递归查询?
      

  5.   

    恩,我这是个分页的查询mysql> select * from tbl_user;
    +--------+------------+----------+----------------------------------+----------+
    ----------+----------+---------------------+--------------+---------------------
    +-------------+
    | c_uid  | c_name_c   | c_name_e | c_pw                             | i_status |
     i_pw_qid | c_pw_ans | d_create            | c_modify_uid | d_modify
    | c_user_type |
    +--------+------------+----------+----------------------------------+----------+
    ----------+----------+---------------------+--------------+---------------------
    +-------------+
    | admin  | 超级管理员 | NULL     | 123456                           |        0 |
         NULL | NULL     | 2009-05-02 13:00:25 | NULL         | 0000-00-00 00:00:00
    | NULL        |
    | 123    | 123        | 123      | 202CB962AC59075B964B07152D234B70 |        1 |
            2 | 123      | 2009-05-03 21:12:19 | NULL         | 0000-00-00 00:00:00
    | NULL        |
    | aaa111 | aaa111     | aaa111   | EABD8CE9404507AA8C22714D3F5EADA9 |        1 |
            1 | aaa111   | 2009-05-04 09:18:48 | NULL         | 0000-00-00 00:00:00
    | A           |
    | aa1234 | ??         | nihao    | E10ADC3949BA59ABBE56E057F20F883E |        1 |
            1 | asdf     | 2009-05-04 12:02:14 | NULL         | 0000-00-00 00:00:00
    | A           |
    +--------+------------+----------+----------------------------------+----------+
    ----------+----------+---------------------+--------------+---------------------
    +-------------+
    4 rows in set (0.03 sec)
      

  6.   

    SELECT * 
    FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY emp.c_uid ASC) AS RowID, 
    emp.c_uid, emp.c_name_c, emp.c_name_e, 
    emp.c_user_type,emp.i_status,emp.d_create 
    FROM tbl_user emp
    ) as list 
    WHERE RowID between (1-1) * 10 + 1 and 1*10   如果只是想取1 到 10 ,也就是前十条记录可以直接。SELECT emp.c_uid, emp.c_name_c, emp.c_name_e, 
    emp.c_user_type,emp.i_status,emp.d_create 
    FROM tbl_user emp
    order by emp.c_uid ASC
    limit 1,10;
      

  7.   


    mysql> select  c_uid,c_name_c,c_name_e,i_status,c_user_type,d_create from tbl_us
    er;
    +--------+------------+----------+----------+-------------+---------------------
    +
    | c_uid  | c_name_c   | c_name_e | i_status | c_user_type | d_create
    |
    +--------+------------+----------+----------+-------------+---------------------
    +
    | admin  | 超级管理员 | NULL     |        0 | NULL        | 2009-05-02 13:00:25
    |
    | 123    | 123        | 123      |        1 | NULL        | 2009-05-03 21:12:19
    |
    | aaa111 | aaa111     | aaa111   |        1 | A           | 2009-05-04 09:18:48
    |
    | aa1234 | ??         | nihao    |        1 | A           | 2009-05-04 12:02:14
    |
    +--------+------------+----------+----------+-------------+---------------------
    +
    4 rows in set (0.00 sec)
    想要的结果
      

  8.   

    但是我不是只取前10条啊   我要求做的是个分页,每次取10条public static string PagerSql(string oldsql, int PageIndex, int PageSize, string strOrder)
            {
                Regex se = new Regex(@"^\s*select", RegexOptions.IgnoreCase);
                oldsql = se.Replace(oldsql, "SELECT ROW_NUMBER() OVER (ORDER BY " + strOrder + ") AS RowID,");
                string sql = "SELECT * FROM "
                            + " (" + oldsql + ") as list "
                            + " WHERE RowID between (" + PageIndex + "-1) * " + PageSize + " + 1 and " + PageIndex + "*" + PageSize;
                sql += "    select count(*) from (" + oldsql + ") as tmp";
                return sql;
            }
      

  9.   

    简单示例:
    set @ff=concat('select c_uid,c_name_c,c_name_e,i_status,c_user_type,d_create from tbl_us limit ',cs1,',',cs2)
      prepare stmt1 from @ff;
    EXECUTE stmt1;
      

  10.   

    恩,是的,在表的标识字段是c_uid   
    mysql> select * from tbl_user;
    +--------+------------+----------+----------------------------------+----------+----------+---------
    -+---------------------+--------------+---------------------+-------------+
    | c_uid  | c_name_c   | c_name_e | c_pw                             | i_status | i_pw_qid | c_pw_ans
     | d_create            | c_modify_uid | d_modify            | c_user_type |
    +--------+------------+----------+----------------------------------+----------+----------+---------
    -+---------------------+--------------+---------------------+-------------+
    | admin  | 超级管理员 | NULL     | 123456                           |        0 |     NULL | NULL
     | 2009-05-02 13:00:25 | NULL         | 0000-00-00 00:00:00 | NULL        |
    | 123    | 123        | 123      | 202CB962AC59075B964B07152D234B70 |        1 |        2 | 123
     | 2009-05-03 21:12:19 | NULL         | 0000-00-00 00:00:00 | NULL        |
    | aaa111 | aaa111     | aaa111   | EABD8CE9404507AA8C22714D3F5EADA9 |        1 |        1 | aaa111
     | 2009-05-04 09:18:48 | NULL         | 0000-00-00 00:00:00 | A           |
    | aa1234 | ??         | nihao    | E10ADC3949BA59ABBE56E057F20F883E |        1 |        1 | asdf
     | 2009-05-04 12:02:14 | NULL         | 0000-00-00 00:00:00 | A           |
    +--------+------------+----------+----------------------------------+----------+----------+---------
    -+---------------------+--------------+---------------------+-------------+
    表的结果和数据
      

  11.   

    MySQL中的分页比较容易,你只要在你的C#中得到N的是从哪条记录开始,取多少个记录就行了。比如页长 10, 那么第8页就是自 80 条记录取10条你直接在C#中算好 80 然后select * from tbl_user order by c_uid limit 80,10 就行了。
      

  12.   

    limit 的用法,可以参考MySQL的官方文档说明。
    http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#select
    13.2.7. SELECT语法LIMIT子句可以被用于限制被SELECT语句返回的行数。LIMIT取一个或两个数字自变量,自变量必须是非负的整数常数(当使用已预备的语句时除外)。使用两个自变量时,第一个自变量指定返回的第一行的偏移量,第二个自变量指定返回的行数的最大值。初始行的偏移量为0(不是1):mysql> SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15为了与PostgreSQL兼容,MySQL也支持LIMIT row_count OFFSET offset语法。如果要恢复从某个偏移量到结果集合的末端之间的所有的行,您可以对第二个参数是使用比较大的数。本语句可以恢复从第96行到最后的所有行:mysql> SELECT * FROM tbl LIMIT 95,18446744073709551615;使用1个自变量时,该值指定从结果集合的开头返回的行数:mysql> SELECT * FROM tbl LIMIT 5;     # Retrieve first 5 rows换句话说,LIMIT n与LIMIT 0,n等价。对于已预备的语句,您可以使用位置保持符。以下语句将从tb1表中返回一行:mysql> SET @a=1;mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?";
    mysql> EXECUTE STMT USING @a;以下语句将从tb1表中返回第二到第六行:mysql> SET @skip=1; SET @numrows=5;mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";
    mysql> EXECUTE STMT USING @skip, @numrows;
      

  13.   

    谢谢各位,
    > mysql> SET @skip=1; SET @numrows=5;mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?"; 
      mysql> EXECUTE STMT USING @skip, @numrows;
    但是如果我要在代码中去控制写而不是直接在MYSQL中执行呢(如string sql="......";),使用位置保持符也一样吗?
      

  14.   

    你的C#程序中已经这个起始位置和记录数,就不需要用 PREPARE  来执行了啊。直接把数字填进去不就可以了?string sql="select * from tbl_user order by c_uid limit 80,10";