1

に変換する必要のある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

完全なPHP関数が必要な場合:Pastebinとスタックトレース:Pastebin

4

4 に答える 4

1

setIntegrityCheck(false)Michaelがすでに述べたように、を使用して他のテーブルと結合するには、が必要です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()

于 2012-10-31T10:03:01.193 に答える
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);
于 2012-10-31T09:19:28.043 に答える
1

式は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はすべてのクエリに制限とオフセットを適用するため、式は役に立たないものです。

また、このクエリを逆に実行することを検討してください。他の方向に参加するか、コメントテーブルに対してのみクエリを実行する方がよい場合があります。あなたの構造の残りの部分を見ずにそれを言うのはちょっと難しいです。

幸運を。

于 2012-10-31T11:36:57.700 に答える
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;

それは完璧に動作します!

于 2012-10-31T12:54:34.477 に答える