【问题标题】:Left Join from Select Zend Framework从选择 Zend 框架的左连接
【发布时间】:2014-04-30 20:33:57
【问题描述】:

如何使用 Zend 框架进行这样的查询

SELECT * FROM `productos` AS `p` 
LEFT JOIN (SELECT SUM(cantidad) AS transferencias FROM transferencias WHERE upc = p`.`upc` and sucursal = 10) 
AS `trans` ON trans.upc = p.upc AND trans.sucursal_clave_destino = 10 

提前谢谢你。

【问题讨论】:

    标签: mysql zend-framework select frameworks left-join


    【解决方案1】:

    你需要试试这个。 我无法尝试,但您可以从我的查询中使用解决方法

    $this->getAdapter()
                ->select()
                ->from(array('p' => 'productos'))
                ->joinLeft(array('trans' => $this->getAdapter()
                                                 ->select()
                                                 ->from('transferencias', 'SUM(cantidad)')
                                                 ->where('upc IN (?)', $this->getAdapter()
                                                                         ->select()
                                                                         ->from('productos', 'upc')
                                                 )->where('sucursal = ?', 10)
                ), 'trans.upc = p.upc')
                ->where('trans.sucursal_clave_destino = ?', 10)
                ->query()
                ->fetchAll();
    

    【讨论】:

    • 嗨@Alexxander.Gor 感谢您的帮助。我只需要交易的总和,我只是在 MySql 中做了一个“视图”,这对我有帮助,但我会考虑这个查询以应对未来的问题。谢谢!!
    【解决方案2】:

    首先,恐怕您的查询无法运行,因为语法错误。正确的写法是:

    SELECT *, SUM(trans.cantidad) as cantidad
    FROM productos AS p
    LEFT JOIN transferencias AS trans
    ON p.upc = trans.upc
    WHERE trans.sucursal_clave_destino = 10 AND trans.sucursal = 10
    

    第一种方法

    我假设您已经以这种方式创建了您的模型:http://framework.zend.com/manual/1.12/en/learning.quickstart.create-model.html

    例如,在您的 Default_Model_ProductosMapper 中:

    function getXXXX(){
    
        $select = "[THE ABOVE QUERY]";
        $result = $this->getDbTable()->getAdapter()->fetchAll($select);
        return $result;
    }
    

    这是最基本的方法。

    第二种方法

    通过使用 Zend_Db 函数,这就像数据库概念中的准备语句。仅当您从用户输入传递参数时才使用它来提高安全性(请参阅SQL injection),否则使用第一种方法是安全的。

    仍然,在您的映射器中:

    function getXXXX(){
    
        $query = $this->getDbTable()->getAdapter()->select();
        $query->from('productos', array());
        $query->joinLeft('transferencias', 'productos.upc = transferencias.upc', array('SUM(trans.cantidad) as cantidad));
        $query->where("trans.sucursal_clave_destino = 10");
        $query->where("trans.sucursal = 10");
    
        // get result
        $stmt = $this->getDbTable()->getAdapter()->query($query);
        $result = $stmt->fetchAll();
        return $result;
    }
    

    第三种方法

    如果您使用像 Doctrine2 这样的数据库 ORM,您还可以编写 SQL 或 DQL(Doctrine Query Language)查询,其语法与 SQL 查询高度相似,但机制绝对不一样。该文件是here。本文档涵盖了上述两种 DQL 方法,还将告诉您将它们放在哪里。

    【讨论】:

    • 感谢@Siwei,我在 Mysql 中解决了我的问题,在“transferencias”表中进行“查看”,然后得到“总数”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多