Подзапрос Zend_Db_Table

У меня есть некоторый SQL, который я хочу использовать с ZendFW, но я не могу заставить его работать, и это сводит меня с ума. Я получаю правильный результат с этим запросом:

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)

Помощь приветствуется. Ваше здоровье :)


person Henryk    schedule 11.11.2009    source источник


Ответы (4)


Ответ Горана - лучший ответ. Но если вам нужен запрос в стиле 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"));
person Mark    schedule 12.11.2009

Я не уверен, что 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)
");
person Goran Jurić    schedule 12.11.2009
comment
Он может обрабатывать подзапросы в параметрах выборки. Но для того, что он пытается сделать с помощью адаптера базы данных, это правильный подход. - person smack0007; 12.11.2009

В моем случае это работает:

$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')
person Edward    schedule 20.04.2012

Я также пытаюсь использовать sql. Это мой код.

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

Я думаю, что этот код более читабелен и прост, чем другие.

person Dinuka Thilanga    schedule 24.11.2011