2009-11-11 99 views
5

我有一些SQL想与ZendFW一起使用,但我无法使它工作,这让我发疯。我用这个查询得到正确的结果:Zend_Db_Table子查询

SELECT DISTINCT e.festival_id FROM entries AS e, mail_log as m 
WHERE e.status = 1 
AND e.festival_id 
NOT IN (SELECT m.entry_id FROM entries AS e, mail_log as m WHERE m.entry_id = e.festival_id) 

帮助将不胜感激。欢呼:)

回答

6

我不确定Zend_Db_Table是否能够处理子查询。

为什么你需要使用Zend_Db_Table?

您可以使用Zend_Db :: query()直接执行查询。

$db = Zend_Db_Table::getDefaultAdapter(); 
$db->query("SELECT DISTINCT e.festival_id FROM entries AS e, mail_log as m 
    WHERE e.status = 1 
    AND e.festival_id 
    NOT IN (SELECT m.entry_id FROM entries AS e, mail_log as m WHERE m.entry_id = e.festival_id) 
"); 
+0

它可以在一个获取PARAMS处理subqueires。但是,他正在尝试使用db适配器是正确的方法。 – smack0007 2009-11-12 12:40:45

11

Goran的回答是最好的答案。但如果你想要一个zend_db_table样式查询,这将是一个替代方案:

$sql = $table->select() 
      ->setIntegrityCheck(false) 
      ->from('entries', new Zend_Db_Expr('DISTINCT festival')) 
      ->where('status = ?', 1) 
      ->where('festival_id NOT IN (?)',new Zend_Db_Expr("SELECT m.entry_id FROM entries AS e, mail_log as m WHERE m.entry_id = e.festival_id")); 
0

我也试试你sql.This是我的代码。

$select = $db->select() 
     ->from(array('e' => ' entries'), array('festival_id')) 
     ->distinct(true) 
     ->where('e.status =?', 1) 
     ->where('e.festival_id NOT IN (SELECT m.entry_id FROM entries AS e, mail_log as m WHERE m.entry_id = e.festival_id)') 
     ->setIntegrityCheck(false); 

我觉得这段代码比其他代码更具可读性和简单性。

4

在我的情况下,这个工程:

$subselect = $db->select() 
    ->from(array('u1' => 'users'), 'departmentId') 
    ->joinInner(array('d' => 'demand'), 'u1.userId = d.adminId', null) 
    ->where('d.demandId = ?', $demand->getId()); 

$select2 = $db->select() 
    ->from(array('u' => 'users')) 
    ->where('u.departmentId = ?', $subselect); 

结果是这样的:

SELECT `u`.* FROM `users` AS `u` WHERE u.departmentId = (SELECT `u1`.`departmentId` FROM `users` AS `u1` INNER JOIN `demand` AS `d` ON u1.userId = d.adminId WHERE d.demandId = '1')