我正在尝试从另一个表中尚未出现的表中获取结果。 为此,我在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子句中使用where-> in()作为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表达式。
答案 0 :(得分:14)
像使用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)))
答案 1 :(得分:1)
我弄清楚了,我们无法使用 - > 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)))