我有一个MySQL标准查询,我需要将其转换为Zend_Db_Select
,但我无法让它工作。
我收到此错误:
Select query cannot join with another table
以下是查询:
// THE COUNTER
$subselect = $this->table->select()->from(
array('x' => 'blog_comments'),
array('x.post_id', new Zend_Db_Expr('count(*) as comments')))
->group('post_id');
// THE TOTAL SELECT
$select->from(array('p' => 'blog_posts'), array('p.*'))
->setIntegrityCheck(false)
->joinLeft(array(
'x' => $subselect,
'x.post_id = p.id',
array()
)
);
如果有人可以转换它,那就太棒了,因为我需要select()
模式,因为我使用Zend_Pagination
。
答案 0 :(得分:1)
您可能需要:setIntegrityCheck(false)
- 审核:http://framework.zend.com/manual/1.12/en/zend.db.select.html了解更多信息
$select = $this->select()
->from(params)
->setIntegrityCheck(false)
->joinLeft(params)
->where(params);
答案 1 :(得分:1)
正如Michael已经提到的,您需要setIntegrityCheck(false)
才能使用Zend_Db_Select
与其他表进行联接。
Error 1064
有点含糊不清,包含各种查询语法问题。所以我建议你将子查询包装在括号中:
$select->setIntegrityCheck(false)
->from(array('p' => 'blog_posts'), array('p.*'))
->joinLeft(array(
'x' => new Zend_Db_Expr("({$subselect})"),
'x.post_id = p.id',
array()
));
如果 不能正常工作,那么您的子选择一定有问题。试试echo $subselect;
,它会调用__toString()
magic method并向您显示您的查询。
答案 2 :(得分:1)
Expression是Count(*)
语句,而不是整个子查询。
$subselect = $this->table->select()->from(
array('x' => 'blog_comments'),
array('x.post_id', new Zend_Db_Expr('count(*) as comments'))
)->group('post_id');
$select->from(array('p' => 'blog_posts'), array('p.*'))
->joinLeft(array(
'x' => $subselect,
'x.post_id = p.id',
array()
));
我不确定你真的需要一个子查询。无论从一个简单的连接开始,还是在它上面构建。
//getGateway = whatever method used to access the database adapter.
//SetIntegrityCheck(false) locks the tables from writes allowing tables to be joined
$select = $this->getGateway()->select()->setIntegrityCheck(false);
$select->from('blog_posts');//default $cols = *
$select->join('blog_comments', 'blog_comments.post_id' = 'blog_posts.post_id');//does it really matter what kind of join you use? They all work the same so use whichever you like.
$select->group('blog_comments.post_id');
一旦您使用默认值进行查询,您可以对其进行优化,直到它按照您的需要运行。
如果您正在进行查询以使用paginator,则count()
表达式是无用的,因为paginator会对每个查询应用限制和偏移量。
您也可以考虑反向执行此查询。您最好不要加入另一个方向,或者只在评论表上执行查询。没有看到你的结构的其余部分,这很难说。
祝你好运。
答案 3 :(得分:0)
我终于以另一种方式做到了。
我在视图中使用CMW_Model_Comments
来获取帖子ID的评论数量。
// IN MY VIEW
echo $this->commentor->getCommentCount($post->id);
// IN MY CONTROLLER
$cmt = new CMW_Model_Comments();
$this->view->commentor = $cmt;
完美无缺!