2015-07-21 96 views
0

我想在ZEND 1.12中执行以下查询。ZEND中的复杂查询

SELECT B . * , COUNT(*) AS CT 
FROM `blogpost` B 
JOIN `blog_likes` L 
WHERE B.`blog_id` = L.`blog_id` 
AND L.liked_post = 'Y' 
GROUP BY B.`blog_id` 
ORDER BY CT DESC 
LIMIT 0 , 10 

我尝试下面的代码,但我想这是不是返回正确的输出:

$this->getDbTable()->select() 
->setIntegrityCheck(false) 
->from(array('B' => 'blogpost'), array("B.*", "COUNT(*) AS CT")) 
->join(array('L' => 'blog_likes'), 'B.blog_id = L.blog_id')     
->where("L.liked_post =?", 'Y') 
->group ("B.blog_id") 
->order ("CT DESC") 
->limit($limit); 

任何一个可以帮我吗?

+0

你的代码输出有什么问题? –

回答

0

首先,您需要传递给您写入的每个连接以及要从该表中选择的列,因此,如果您不想从L表中选择任何列,您的加入应该是这样的:

->join(array('L' => 'blog_likes'), 'B.blog_id = L.blog_id', array()) 

如果你离开的最后一个参数为空,它会选择所有列(L. *)。

其次,列的阵列,其传递给一个从或加入,可以设置别名通过使用该密钥的值,即:

->from(array('B' => 'blogpost'), array("B.*", "CT" => "COUNT(*)")) 

这使得更具有可读性。

最后但并非最不重要的是,你在计算from,那将不会计算内部表所有的行,但只包括from的。所以,如果你想从决赛桌数行,我猜你是想用SQL语句,你必须做的是:

$this->getDbTable()->select() 
    ->setIntegrityCheck(false) 
    ->from(array('B' => 'blogpost'), array("B.*")) 
    ->join(array('L' => 'blog_likes'), 'B.blog_id = L.blog_id', array("CT" => "COUNT(*)"))     
    ->where("L.liked_post =?", 'Y') 
    ->group ("B.blog_id") 
    ->order ("CT DESC") 
    ->limit($limit); 

计数可有点怪怪的使用,所以我建议你用这种方式来代替:

$this->getDbTable()->select() 
    ->setIntegrityCheck(false) 
    ->from(array('B' => 'blogpost'), array()) 
    ->join(array('L' => 'blog_likes'), 'B.blog_id = L.blog_id', array())     
    ->where("L.liked_post =?", 'Y') 
    ->group ("B.blog_id") 
    ->order ("CT DESC") 
    ->limit($limit) 
    ->columns(array(
     "B.*", 
     "CT" => "COUNT(*)"  
    )); 

要了解更多信息,请转到Zend_Db_Select documentation.

我希望这有助于。