8

別のテーブルにまだ存在しないテーブルから結果を取得しようとしています。このために、where 句で subQuery とNOT IN式を使用しています。動作する通常の sql は次のようになります。

SELECT `products`.* FROM `products` WHERE `products`.`pro_id` **NOT IN** (
SELECT `product_collection`.`pro_id` AS `pro_id` FROM `product_collection` WHERE `coll_id` = '6' ) AND products.pro_id IN (55,56,57,62)

プロジェクトに zf2 を使用しています。問題は、where 句内でNOT IN式を使用する方法がわからないことです。Where->in() を Where 句の IN 式に使用できます。たとえば。

//$productIds is an array
//$collectionId is an id

$subSelect = $this->getRawSql()->select('product_collection');
$subSelect -> columns(array('pro_id'));
$subSelect -> where(array('coll_id'=>$collectionId));

$select = $this->getRawSql()->select('products');
$select -> **where->in**('products.pro_id', $subSelect)
        -> where->in('products.pro_id',$productIds);

しかし、NOT IN式の使い方がわかりません。

4

2 に答える 2

2

NotIn 述語に -> 演算子を使用できないことがわかりました。NotIn Predicate の新しいインスタンスを作成し、それを次のように where 句に渡して機能させる必要がありました。

$select -> where(new NotIn('products.pro_id',$subSelect))

助けてくれてありがとうFouad 。またはFouadが示唆したように、私は以下を試してみましたが、それもうまくいきました!.

$select -> where->addPredicate(new \Zend\Db\Sql\Predicate\Expression('products.pro_id NOT IN (?)', array($subSelect)))
于 2013-09-07T09:17:56.600 に答える