我想在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);
任何人都可以帮助我吗?
答案 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.
我希望这会有所帮助。