Zend framework 如何在Zend中执行此sql查询?

Zend framework 如何在Zend中执行此sql查询?,zend-framework,Zend Framework,我如何在Zend框架中进行sql查询,我需要了解在PDO上下文中如何进行查询?我尝试了->查询,但不确定是否正确。这三个变量是user_id和to和from date SELECT ss.subcategory_id, ss.subcategory_name, ss.subcategory_issaving, IFNULL(SUM(m.mv_monthly_total),0) AS expendsum FROM (SELECT s.subcategory_id, s.

我如何在Zend框架中进行sql查询,我需要了解在PDO上下文中如何进行查询?我尝试了->查询,但不确定是否正确。这三个变量是user_id和to和from date

SELECT 
 ss.subcategory_id,
 ss.subcategory_name,
 ss.subcategory_issaving,
 IFNULL(SUM(m.mv_monthly_total),0) AS expendsum
FROM
 (SELECT
    s.subcategory_id,
    s.subcategory_name,
    s.subcategory_issaving
FROM
    subcategory s
  WHERE 
    s.subcategory_isexpend = 'Y'
  AND 
    s.subcategory_issaving = 'Y') ss
LEFT JOIN 
  mv_monthly m
ON ss.subcategory_id = m.mv_monthly_subcategory_id
AND m.mv_monthly_user_id = 2
AND m.mv_monthly_month >= '2010-01-01'
AND m.mv_monthly_month <= '2020-01-01'
GROUP BY  
 ss.subcategory_id,
 ss.subcategory_name,
 ss.subcategory_issaving
ORDER BY
 ss.subcategory_issaving DESC,
 expendsum;
我尝试了以下方法,但没有成功

    $db = Zend_Db_Table::getDefaultAdapter();
    $dbExpr1 = new Zend_Db_Expr("s.subcategory_id, s.subcategory_name, s.subcategory_issaving");
    $dbExpr2 = new Zend_Db_Expr("ss.subcategory_id, ss.subcategory_name, ss.subcategory_issaving, IFNULL(SUM(m.mv_monthly_total),0) AS expendsum");   
    $select = $db->select()
        ->from(
            array(
                'ss' => new Zend_Db_Expr(
                    '('. $db->select()
                        ->from(array("s" => "subcategory"), $dbExpr1)
                        ->where("s.subcategory_isexpend = 'Y'")
                        ->where("s.subcategory_issaving = 'Y'") .')'
                )
            ),
            $dbExpr2
        )
        ->joinLeft(array("m" => "mv_monthly"), "ss.subcategory_id = m.mv_monthly_subcategory_id")
        ->where("m.mv_monthly_user_id = ?", $user_id)       
        ->where("m.mv_monthly_month >= ?", $fromMonth)
        ->where("m.mv_monthly_month <= ?", $toMonth)
        ->group(array("ss.subcategory_id","ss.subcategory_name","ss.subcategory_issaving"))
        ->order(array("ss.subcategory_issaving DESC", "expendsum"));
    $row = $db->fetchAll($select);

对于这样一个复杂的查询,您可以直接执行它,而不是使用面向对象的方法,因为这样的查询会变得相当复杂

尝试以下操作,将我的查询替换为你的查询,并将变量绑定到查询中:

    $db   = Zend_Db_Table::getDefaultAdapter();
    $stmt = new Zend_Db_Statement_Pdo($db, 'SELECT a, b, c FROM a WHERE username = ? AND date = ?');

    try {
        $res  = $stmt->execute(array($user_id, $fromMonth));

        if ($res) {
            $rows = $stmt->fetchAll();
        }
    } catch (Zend_Db_Statement_Exception $dbex) {
        // log Query failed with exception $dbex->getMessage();
    }
如果您喜欢使用面向对象的方法,或者因为查询的某些部分是有条件的,所以需要使用面向对象的方法,我通常首先通过子查询构建它们自己的select,您可以简单地将它们嵌入到主查询中,并为子查询使用select对象

我的意思是:

    $subselect = $this->getDbTable()
                      ->select()
                      ->from('mytable', array('time' => 'max(time)', 'id'))
                      ->where('id IN (?)', $serialNumbers)
                      ->group('id');

    $select    = $this->getDbTable()
                      ->select()
                      ->setIntegrityCheck(false)
                      ->from('mytable')
                      ->join('other', 'mytable.id = other.id', array('label'))
                      ->join(array('dt' => $subselect),
                             '(mytable.time, mytable.id) = (dt.time, dt.id)', '');      

我认为您必须认真考虑使用视图。不幸的是,视图不是我们的选择。