4

JOIN ステートメント内に SELECT がある Zend Framework 2 でクエリを実行しようとしています。これまでのところ、私が試したことは次のとおりですが、 SELECT オブジェクトを join() の最初のパラメーターに挿入することは機能していないようです。グループ化を行う前に最初に結果を並べ替える必要があるため、このようなアプローチに頼りました。それを機能させる方法についてのアイデアはありますか?

public function getSearchKeyword($keyword, $limit)
{
    $select = $this->keywords->getSql()->select();

    $subquery = $this->pages->getSql()->select();
    $subWhere = new \Zend\Db\Sql\Where();
    $subWhere->equalTo('delete_flag', 'n')
             ->equalTo('published_flag', 'y');
    $subquery->where($subWhere);

    $where = new \Zend\Db\Sql\Where();
    $where->like('keyword', '%' . $keyword . '%')
          ->equalTo('delete_flag', 'n');

    $select->columns(array('display' => 'keyword', 'url'))
           ->join(array('sub' => $subquery), 'sub.page_id = keywords.page_id', array())
           ->where($where)
           ->group(array('keywords.page_id', 'keywords.keyword'))
           ->order(array('rank', 'keyword'))
           ->limit($limit);
    $row = $this->tableGateway->selectWith($select);
    return $row;
}

私が書こうとしているクエリは以下のとおりです。

SELECT keywords.keyword AS display, keywords.url
FROM keywords
INNER JOIN 
(
SELECT * FROM pages WHERE published_flag = 'y' AND delete_flag = 'n' ORDER BY page_id DESC
) pages 
ON pages.page_id = keywords.page_id
WHERE published_flag = 'y'
AND delete_flag = 'n'
AND keywords.keyword LIKE '%?%'
GROUP BY display, page_id;
4

4 に答える 4

0

これを試すことができます。

  $select->columns(array('display' => 'keyword', 'url'))
         ->join(array('sub' => 'pages'), 'sub.page_id = keywords.page_id', 
                array(), $select::JOIN_INNER)
         ->where($where)
         ->group(array('keywords.page_id', 'keywords.keyword'))
         ->order(array('rank', 'keyword'))
         ->limit($limit);
于 2014-02-27T07:35:03.530 に答える
0

私は同様の問題に直面しました。FROMtableとサブクエリの FROMtableが異なるため、エラーが発生しました。私の回避策は、SQL を抽出してステートメントを作成することでした。

        $sql    = $select->getSqlString(new \Zend\Db\Adapter\Platform\Mysql());
        $stmt = $this->getAdapter()->createStatement($sql);
        $stmt->prepare($sql);
        $result = $stmt->execute();

        $resultSet = new ResultSet(); \\ Class Zend\Db\ResultSet\ResultSet

        $resultSet->initialize($result);
于 2016-02-25T16:02:56.000 に答える