2012-08-29 27 views
5

我想使用Zend框架的SQL查询里面的WITH语法中,SQL是这样的:如何使用Zend框架编写子查询重构WITH子句?

WITH t AS 
(SELECT item_id, row_number() OVER (ORDER BY some_criteria DESC) rn 
    FROM orders) 
SELECT t2.rn, t2.item_id 
    FROM t t1 JOIN t t2 ON (t2.rn > t1.rn) 
WHERE t1.item_id = 145; 

我如何在Zend框架做呢?与Zend_Db_Select?有什么建议么?

回答

3

随着Zend_Db_Select对象,你不能做到这一点在美丽的方式,所以我建议你用简单的查询:

$q = "WITH t ..." 
$db->fetchAll($q); 
0

我 - 经济通

使用Zend_Db_Select对象不是强制性的。对于非常简单的SELECT查询, 将整个SQL查询指定为字符串通常更简单,并且 使用适配器方法(如查询()fetchAll())执行它。使用 如果您需要在程序上或基于应用程序中的条件逻辑来组装SELECT查询 ,则Zend_Db_Select非常有用。

所以,你可以试试这个

$wthselect = 'WITH t AS 
      (SELECT item_id, row_number() OVER (ORDER BY some_criteria DESC) rn 
       FROM orders) 
     SELECT t2.rn, t2.item_id 
      FROM t t1 JOIN t t2 ON (t2.rn > t1.rn) 
      WHERE t1.item_id = 145'; 

$stmt = $select->query($wthselect); 
$result = $stmt->fetchAll(); 
0

Zend_Db_Select是有用的,如果查询是有点复杂,参数和逻辑包含在您的应用程序,如已经引述了另一种答案。请查看official Zend Framework上的链接了解此结构的详细说明。

同时检查来自Zend Framework社区的this useful link,特别是this post。它清楚地表明,对于小而复杂的查询,如您发布的那样,使用fetchAll()query()指令更简单。

所以,我的建议,使用fetchAll()query()您的情况。