Php Zend_Db_Adapter_Oracle:通过订单、限制和;哪里
我正在尝试从Oracle 11g数据库中选择一些记录。该语句用于为HTML表实现某种“筛选”函数 要求:分页限制和对过滤结果排序 查询是使用Zend\u Db\u Select创建的 *非常有魅力:Php Zend_Db_Adapter_Oracle:通过订单、限制和;哪里,php,sql,oracle,zend-framework,Php,Sql,Oracle,Zend Framework,我正在尝试从Oracle 11g数据库中选择一些记录。该语句用于为HTML表实现某种“筛选”函数 要求:分页限制和对过滤结果排序 查询是使用Zend\u Db\u Select创建的 *非常有魅力: $select->where('APPLICATIONS LIKE ?', '%MYAPP1%'); $select->where('APPLICATIONS NOT LIKE ?', '%GENESIS%'); $select->limit(20); =1个匹配结果(可以!)
$select->where('APPLICATIONS LIKE ?', '%MYAPP1%');
$select->where('APPLICATIONS NOT LIKE ?', '%GENESIS%');
$select->limit(20);
=1个匹配结果(可以!)
尝试对过滤结果排序时出现问题:
$select->order('PATH ASC');
=3个匹配结果
我认为这与Zend DB Select生成的查询有关,如下所示:
SELECT z2.*
FROM (
SELECT z1.*, ROWNUM AS "zend_db_rownum"
FROM (
SELECT "APPS".* FROM "APPS" WHERE (APPLICATIONS LIKE '%MYAPP1%') AND (APPLICATIONS NOT LIKE '%GENESIS%') ORDER BY "PATH" ASC
) z1
) z2
WHERE z2."zend_db_rownum" BETWEEN 1 AND 20
- 如果我不按顺序运行查询,一切正常
- 如果我不受限制地运行查询,一切都很好
- 如果我使用订单+限额->错误结果运行查询
重要提示:我正在对Oracle视图执行查询,如果我对“表”执行查询,它也会工作。如果您检查SQL生成中没有错误,并且WHERE子句中确实没有不同的条件,则可能是Oracle server错误。要检查它,请在不同的Oracle server版本或不同的Oracle server修补程序级别上进行尝试 显然,Oracle对查询的解释与Zend框架的意图不同: Oracle似乎在排序之前将ROWNUM与内部查询上的行号计数关联起来,因此别名zend_db_ROWNUM在外部查询的where子句中提供了错误的数字 由于我们无法控制Zend framework响应limit()指令生成SQL的方式,因此我能想到的唯一解决方法是跳过Zend limit()指令,而是按照以下方式执行操作:
$select->where('APPLICATIONS LIKE ?', '%MYAPP1%');
$select->where('APPLICATIONS NOT LIKE ?', '%GENESIS%');
$select->order('PATH ASC');
$sql = $select->__toString();
$sql = "select * from (" . $sql . ") where ROWNUM between 1 and 20";
$stmt = $db->query( $sql, array());
$result = $stmt->fetchAll();
当然,这种变通方法只有在没有开发跨DB的情况下才是合法的,因此代码不必是DB不可知的。
也就是说,如果您使用我建议的解决方案,您将把解决方案限制在Oracle上。如果zend将订单放在最后,则确定问题在于订单在“子选择”中(;在此SQL中,ORDER BY不能超出-ROWNUM需要在已排序的行上具体化。您可以准备或询问其他Oracle版本吗?如果可以更改SQL,可以使用row_number()窗口函数更改ROWNUM?igr:可以用更多详细信息解释此问题吗?关于ROWNUM的更多详细信息。关于row_number()的更多信息)可以在页面开始处找到以下链接。请注意,文档适用于11.2-如果您的服务器版本不同,请参考另一个版本。重要的是:我对Oracle视图执行查询,如果我对“表”执行查询,它也可以工作。我已经实现了类似的一些功能(将SQL转换为字符串,并将顺序添加到末尾)但是你的建议看起来更好。谢谢