mysql中怎么解决关于ROW_NUMBER()的问题

stromboy007 2009-05-04 03:03:47
如题:

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中有什么方法可以替代????
...全文
24037 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
fl49809045 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ACMAIN_CHM 的回复:]
MySQL中的分页比较容易,你只要在你的C#中得到N的是从哪条记录开始,取多少个记录就行了。

比如页长 10, 那么第8页就是自 80 条记录取10条

你直接在C#中算好 80 然后

select * from tbl_user order by c_uid limit 80,10 就行了。
[/Quote]
这个方法就
可以解决问题的楼主
stromboy007 2009-05-04
  • 打赏
  • 举报
回复
哦 呵呵
谢谢
ACMAIN_CHM 2009-05-04
  • 打赏
  • 举报
回复

你的C#程序中已经这个起始位置和记录数,就不需要用 PREPARE 来执行了啊。

直接把数字填进去不就可以了?

string sql="select * from tbl_user order by c_uid limit 80,10";
stromboy007 2009-05-04
  • 打赏
  • 举报
回复
谢谢各位,
> mysql> SET @skip=1; SET @numrows=5;mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";
mysql> EXECUTE STMT USING @skip, @numrows;
但是如果我要在代码中去控制写而不是直接在MYSQL中执行呢(如string sql="......";),使用位置保持符也一样吗?
ACMAIN_CHM 2009-05-04
  • 打赏
  • 举报
回复

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;
ACMAIN_CHM 2009-05-04
  • 打赏
  • 举报
回复

MySQL中的分页比较容易,你只要在你的C#中得到N的是从哪条记录开始,取多少个记录就行了。

比如页长 10, 那么第8页就是自 80 条记录取10条

你直接在C#中算好 80 然后

select * from tbl_user order by c_uid limit 80,10 就行了。
stromboy007 2009-05-04
  • 打赏
  • 举报
回复
恩,是的,在表的标识字段是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 |
+--------+------------+----------+----------------------------------+----------+----------+---------
-+---------------------+--------------+---------------------+-------------+

表的结果和数据
WWWWA 2009-05-04
  • 打赏
  • 举报
回复
简单示例:
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;
stromboy007 2009-05-04
  • 打赏
  • 举报
回复
但是我不是只取前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;
}
WWWWA 2009-05-04
  • 打赏
  • 举报
回复
楼主要详细一点,记录中是否有唯一标识的字段,你是要分页显示,且统计
满足条件的记录?多贴一些数据以供测试。
stromboy007 2009-05-04
  • 打赏
  • 举报
回复

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)

想要的结果
ACMAIN_CHM 2009-05-04
  • 打赏
  • 举报
回复

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;
stromboy007 2009-05-04
  • 打赏
  • 举报
回复
恩,我这是个分页的查询

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)
WWWWA 2009-05-04
  • 打赏
  • 举报
回复
楼主的要求恐怕不是简单的ROW_NUMBER(),你的SQL是递归查询?
百年树人 2009-05-04
  • 打赏
  • 举报
回复
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: 0

mysql> 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)
ACMAIN_CHM 2009-05-04
  • 打赏
  • 举报
回复
rucypli 2009-05-04
  • 打赏
  • 举报
回复
select * 
from tb
limit X,Y
WWWWA 2009-05-04
  • 打赏
  • 举报
回复
贴数据及要求结果贴出来看看

56,682

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧