首页 新闻 会员 周边 捐助

关于sql语句,求解

0
悬赏园豆:5 [已解决问题] 解决于 2013-12-30 13:06

sql = "select * from" +
   "(select msg.*,rownum r from msg where 1=1 and " +
   username + title + msgcontent + sendto + state + msg_create_date +
   " and rownum <= " + msgs_in_one_page*page_no + ") " +
   "t where t.r >" + msgs_in_one_page*(page_no - 1);

什么意思,求解

这是 oracle数据库

问题补充:

这里有变量,这应该是分页的sql语句,求解释

博学多思的主页 博学多思 | 初学一级 | 园豆:76
提问于:2013-12-29 15:23
< >
分享
最佳答案
0

如果想要知道SQL语句查出来的是什么东西,这个就真的看不出来

如果只是想要知道这个语句是怎么实现分页查询的,可以看下面:

msgs_in_one_page应该是每页显示的条数,page_no表示需要查询的第几页,而rownum是Oracle的一个虚拟字段,表示这个记录处于数据的第几行(大概是这么个意思)

首先使用rownum <= msgs_in_one_page*page_no作为子查询的筛选条件,表示查询出来前面n条记录,这里的n是需要查询的第几页及前面所有页的数据

接着在子查询的select语句中存在rownum r,表示把rownum也作为一个字段r暴露给外面的查询

然后是在外面的查询使用where t.r > msgs_in_one_page*(page_no - 1)表示r的值要大于前一页的最后一条记录,也就是过滤掉前一页及前面所有页的数据,只保留需要查询的第几页的数据

结果就是查询出来的数据就是page_no表示的那一页的数据了

收获园豆:1
诶碧司 | 小虾三级 |园豆:1912 | 2013-12-30 12:08
其他回答(4)
0

username + title + msgcontent + sendto + state + msg_create_date这里都不能构成条件,没看懂你的SQL语句,如果这样写是正确的,记得给我说说是怎么回事哈

收获园豆:1
Crazy Lee | 园豆:211 (菜鸟二级) | 2013-12-29 15:58

username + title + msgcontent + sendto + state + msg_create_date这几个都是变量,我也不明白,求解

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2013-12-29 16:25

t是什么?

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2013-12-29 16:28
0

首先这个SQL语句你是从哪里弄来的?很明显是一个分页的查询语句,而且是拼凑而成的,从经验上来讲应该不是一个正确的SQL语句,字符串的形式拼凑SQL语句是很正常的和常见的一种SQL语句的写法。不过变量中的值不光是数字类型的(从名字上来看,有字符串类型的,有时间类型的)所以此SQL语句是应该是错误的!

收获园豆:1
godtrue | 园豆:242 (菜鸟二级) | 2013-12-29 18:36

username + title + msgcontent + sendto + state + msg_create_date是从map中取出的变量,上文有这些,但是我不明白上面的分页sql语句什么意思,

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2013-12-30 11:42
0

就是一sql语句啊,不知道这句写的对不对。你自己主要搞清楚那个 ROW_Number Over() 函数就行了。

收获园豆:1
Revolution_lxx | 园豆:7 (初学一级) | 2013-12-29 20:19

username + title + msgcontent + sendto + state + msg_create_date是从map中取出的变量,上文有这些,但是我不明白上面的分页sql语句什么意思,

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2013-12-30 11:42

@博学多思: 看如下列子:

假设这样一张表 news(ID,HeadLine, Body,Time,Pic)

比如检索出22-32条记录(这两个数据可以在程序中凑配如你自己给出的msgs_in_one_page*page_no,那么这里msgs_in_one_page表示一页显示的数据条数,page_no表示页号,实现高速分页等其他功能)

select * from(select *, ROW_NUMBER() over (order by Time Desc) as row_number  from news ) as V where V.row_number>=22 and V.row_number<32;

1. ROW_NUMBER() over (order by Time Desc) as row_number   :按时间降序把检索出来的数据编号,该列取别名为row_number。

2. 把检索出来的数据作为一个子表 V

3.  在V中检索出满足行号的数据。

支持(0) 反对(0) Revolution_lxx | 园豆:7 (初学一级) | 2013-12-30 12:02
0

   username + title + msgcontent + sendto + state + msg_create_date +
   " and rownum <= " + msgs_in_one_page*page_no + ") " +
   "t where t.r >" + msgs_in_one_page*(page_no - 1);

这个就是通过变量连接查询字符串

你在上下文里找找看,哪里有这些变量

收获园豆:1
Albert Fei | 园豆:2102 (老鸟四级) | 2013-12-30 09:58

username + title + msgcontent + sendto + state + msg_create_date是从map中取出的变量,上文有这些,但是我不明白上面的分页sql语句什么意思,

支持(0) 反对(0) 博学多思 | 园豆:76 (初学一级) | 2013-12-30 11:42

@博学多思: 你设个断点 调试一下就明白了

支持(0) 反对(0) Albert Fei | 园豆:2102 (老鸟四级) | 2013-12-31 09:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册