8

我正在尝试从另一个表上不存在的表中获取结果。为此,我在 where 子句中使用了子查询和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

16

像使用 In() 一样使用 notIn()。
请参阅:http: //framework.zend.com/apidoc/2.1/classes/Zend.Db.Sql.Predicate.NotIn.html

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

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

编辑 :

或者改用这个

$select ->where
        ->addPredicate(new Zend\Db\Sql\Predicate\Expression('products.pro_id NOT IN (?)',
                            array($subSelect)))
于 2013-09-07T07:01:50.160 回答
2

我想通了,我们不能对 NotIn 谓词使用 -> 运算符。我必须创建一个 NotIn Predicate 的新实例并将其传递给下面的 where 子句以使其工作。

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

谢福阿德的帮助。或者正如 Fouad 暗示的那样,我在下面尝试过,它也有效!

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