【问题标题】:Replicate MYSQL JOIN query with Zend_Db join()使用 Zend_Db join() 复制 MYSQL JOIN 查询
【发布时间】:2012-02-04 10:04:59
【问题描述】:

您好,这是我的 sql 查询

SELECT A.id, A.name, ACC.id, ACC.name
FROM accounts A
LEFT JOIN friends F ON A.id = F.account_id
LEFT JOIN accounts ACC ON F.friend_id = ACC.id
LIMIT 0 , 30

如何使用 Zend_Db join 复制它?

我创建了这个函数

function getFriends()
    {
        $query = $this->select()->setIntegrityCheck(false);
        $query->from(array('a'=>'accounts'),array('a.id','a.name','b.id','b.name'));
        $query->join(array('f'=>'friends'),'f.account_id = a.id',array());
        $query->join(array('b'=>'accounts'),'b.id = f.friend_id',array());
        $results = $this->fetchAll($query);
        return $results->toArray();
    }

但它只返回右表,不返回左表...

【问题讨论】:

    标签: mysql database join abstract zend-framework


    【解决方案1】:

    如果你想使用LEFT JOIN,你应该使用$query->joinLeft()。

    旁注;出于性能原因,您最好使用Zend_Db_Select 而不是Zend_Db_Table 选择:

    $query = $this->_db->select();
    $query->from(array('a'=>'accounts'),array('account_id' => 'a.id', 'account_name' => 'a.name', 'friend_account_id' => 'b.id','friend_account_name' => 'b.name'));
    $query->joinLeft(array('f'=>'friends'),'f.account_id = a.id',array());
    $query->joinLeft(array('b'=>'accounts'),'b.id = f.friend_id',array());
    
    return $this->_db->fetchAll($query);
    

    注意:确保您选择的所有列都有唯一的名称。 'a.id' 和 'b.id' 都会产生列名 'id',其中 b.id 将覆盖 a.id 的值。

    【讨论】:

    • 是的,正如您在我的问题中看到的那样,我知道如何进行连接,此时 LEFT 或 RIGHT 的前提并不重要,因为如果您在 phpMyAdmin 中运行 SQL,它应该返回一个表有 4 列。 Zend DB 只返回前两列。我可以通过两次查询同一件事来解决这个问题,但是请......这是任何人都会做的最愚蠢的事情,而且不是好的编程风格
    • 确保您选择的所有列都有唯一的名称。我已经更新了我的答案。
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 2011-09-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多