我希望能够使用相当于MySQL的LIMIT,OFFSET in Progress OpenEdge 10.1b。
虽然从Progress OpenEdge 11开始提供FETCH / OFFSET命令,但遗憾的是版本10.1B没有它们,因此很难生成分页记录集(例如记录1-10,11-20,21-30等。 )。
10.1b也不支持ROW_NUMBER。似乎它与SQL Server 2000中的功能几乎相同。
如果始终按主键id(pkid)的顺序搜索,这可以通过使用“SELECT TOP 10 * FROM table ORDER BY pkid ASC”来实现,然后识别最后一个pkid并使用“SELECT”查找下一个ptid TOP 10 * FROM table WHERE pkid> last_pkid ORDER BY pkid ASC“;但这只适用于按pkid排序时。
我的解决方案是编写一个PHP函数,我可以传递限制和偏移量,然后只返回行数在我定义的值之间的结果。我使用TOP返回的不超过限制和偏移的总和。
function limit_query($sql, $limit=NULL, $offset=0)
{
$out = array();
if ($limit!=NULL) {
$sql=str_replace_first("SELECT", "SELECT TOP ".($limit+$offset), $sql);
}
$query = $db->query($sql); //$db is my DB wrapper class
$i=0;
while ($row = $this->fetch($query)) {
if ($i>=$offset) { //only add to return array if greater than offset
$out[] = $row;
}
$i++;
}
$db->free_result($query);
return $out;
}
这适用于小型记录集或结果的前几页,但如果总结果为数千,如果要查看第20页,100或300页的结果,则效率非常低且效率低(页面一个是仅查询前10个结果,第2页查询前20个,但第100页将查询前1000个结果。
虽然在大多数情况下,用户可能不会冒险超过第2页或第3页,因此缺乏效率可能不是一个主要问题,我想知道是否有更有效的方法来模拟此功能。
遗憾的是,由于数据库是由第三方软件提供的,因此不能选择升级到更新版本的Progress或MySQL等高级数据库。
有人可以建议其他更有效的方法吗?
答案 0 :(得分:1)
我不确定我是否完全理解这个问题,所以我们试图给你一个答案: 您可能无法通过一次点击来完成所需的操作。只需对记录/添加功能进行排序,您可能无法实现您想要获得的分页功能。据我所知,Progress不会对这些行进行编号,除非你按照说法对某些新月pkid进行排序。 我给你的建议是在后端运行一个程序来创建一个批量大小与页面相同的查询(在你的情况下为10),并使用循环来获得下一批,直到得到你需要的那个。查看批处理数据集或使用MAX-ROWS使用打开的查询。 希望它有所帮助,或者至少给你一个想法。我实际上喜欢你的PHP实现,它似乎是一个很好的解决方法,而不是难以保持。
答案 1 :(得分:0)
您应该能够安装Progress的升级版本,转换数据库并根据新版本重新编译代码。通常,您通过供应商提供的支持将为您提供最新版本的Progress(Openedge),这不会是一个大问题。从版本10到11不应该导致任何编译问题,并为您提供新版本的所有SQL优势。
老实说,你对MySql优秀的评论有点令人困惑,但那是另一天的讨论。 ; d
祝你好运!