2009-11-11 16 views
5

J'ai un SQL que je veux utiliser avec ZendFW, mais je n'arrive pas à le faire fonctionner et ça me rend fou. J'obtiens le résultat correct avec cette requête:Sous-requête 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) 

Aide serait appréciée. Salutations :)

Répondre

6

Je ne suis pas sûr que Zend_Db_Table est capable de gérer les sous-requêtes.

Pourquoi avez-vous besoin d'utiliser Zend_Db_Table?

Vous pouvez exécuter la requête directement à l'aide de 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

Il peut gérer subqueires dans les params d'une extraction. Mais pour ce qu'il essaie de faire en utilisant l'adaptateur db est la bonne approche. – smack0007

11

La réponse de Goran est la meilleure réponse. Mais si vous voulez une requête de style Zend_Db_Table, ce serait une solution de rechange:

$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

J'essaie aussi vous sql.This mon code.

$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); 

Je pense que ce code est plus lisible et plus simple que d'autres.

4

Dans mon cas, cela fonctionne:

$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); 

Le résultat était le suivant:

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')