ZEND中的复杂查询

时间:2015-07-21 06:27:51

标签: php zend-framework

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

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);

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

首先,你需要传递from和你所写的每个连接,你要从该表中选择的列,因此,如果你不想从L表中选择任何列,你的加入应该看起来像:

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

如果将最后一个参数留空,则会选择所有列(L。*)。

其次,对于传递给from或join的列数组,可以使用该键的值设置别名,即:

 ->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.

我希望这会有所帮助。