Написание подзапроса с использованием Zend DB - PullRequest
27 голосов
/ 27 августа 2009

У меня возникли проблемы с преобразованием приведенного ниже SQL-запроса в запрос Zend Db.

$select = ' SELECT s.id, i.id as instance_id, i.reference, i.name, i.sic_code, i.start_date
                FROM sles s
                JOIN sle_instances i
                ON s.id = i.sle_id
                WHERE i.id = (  SELECT MAX(id) 
                                FROM sle_instances 
                                WHERE sle_id = s.id
                                )
                ORDER BY i.name ASC';

Я дошел до кода раньше - но Zend Db не правильно выводит запрос. Может ли кто-нибудь показать мне, что мне не хватает ??

$select = $db->select() ->from('sles', array(   'id',
                                                'instance_id'   => 'sle_instances.id',                                                                                          
                                                'reference'     => 'sle_instances.reference',           
                                                'name'          => 'sle_instances.name',
                                                'sic_code'      => 'sle_instances.sic_code',
                                                'start_date'    => 'sle_instances.start_date'
                                             )
                              )
                        ->join('sle_instances', 'sles.id = sle_instances.sle_id')
                        ->where('sles.id = (SELECT MAX(id) FROM sle_instances WHERE sle_id = sles.id)')
                        ->order('sle_instances.name ASC');

Кстати, SQL работает. Я переписываю его, используя Zend Db, так как хочу использовать функциональность Zend Paginator.

Любая помощь очень ценится.

PJ

Ответы [ 4 ]

32 голосов
/ 27 августа 2009

если хотите, вы можете взять то, что сделал @ karim79, и превратить ваш отбор в $ this-> select (), а также ...

$subselect = $db->select()
->from('sle_instances', array(new Zend_Db_Expr('max(id)')))
->where('sle_id = s.id');

$select = $db->select()->from(array("s" => "sles"), 
array("s.id","i.id as instanceid","i.reference","i.name","i.sic_code","i.start_date"))
->join(array('i' => "sle_instances"),"s.id = i.sle_id",array())
->where("i.id = ($subselect)")
->order('i.name asc');

print($select);

//SELECT `s`.`id`, `i`.`id` AS `instanceid`, `i`.`reference`, `i`.`name`, `i`.`sic_code`, `i`.`start_date` FROM `sles` AS `s` INNER JOIN `sle_instances` AS `i` ON s.id = i.sle_id WHERE (i.id = (SELECT max(id) FROM `sle_instances` WHERE (sle_id = s.id))) ORDER BY `i`.`name` asc
20 голосов
/ 27 августа 2009

Это:

    $select = $db->select()->from(array("s" => "sles"), array("s.id","i.id as instanceid","i.reference","i.name","i.sic_code","i.start_date"))
                                 ->join(array('i' => "sle_instances"),"s.id = i.sle_id",array())
                                 ->where("i.id = (select max(id) from sle_instances where sle_id = s.id)")
                                 ->order('i.name asc');

Даёт это:

"SELECT `s`.`id`, `i`.`id` AS `instanceid`, `i`.`reference`, `i`.`name`, `i`.`sic_code`, `i`.`start_date` FROM `sles` AS `s`
 INNER JOIN `sle_instances` AS `i` ON s.id = i.sle_id WHERE (i.id = (select max(id) from sle_instances where sle_id = s.id)) ORDER BY `i`.`name` asc"
3 голосов
/ 05 сентября 2010

У меня была очень похожая проблема, и я обнаружил, что этот запрос можно легко написать следующим образом:

$select = $db->select()
  ->from (
    array("s" => "sles"), 
    array(
      "s.id",
      "instanceid" => "i.id",
      "i.reference",
      "i.name",
      "i.sic_code",
      "i.start_date")
  )
  ->join(
    array('i' => "sle_instances"),
    "s.id = i.sle_id",
    array()
  )
  ->where ("i.id = (" . 
    $db->select()
    ->from('sle_instances', array(new Zend_Db_Expr('max(id)')))
    ->where('sle_id = s.id');
  .")")
  ->order('i.name asc');
print($select);

Это точно так же, как люди уже заявили здесь. Но я чувствовал, что это немного легче читать, так как зависимости подзапроса более очевидны.

1 голос
/ 10 февраля 2011

Отличный вопрос! Спасибо за это. Также хотелось бы исключить, что если вы пытаетесь создать группу после заказа, вы также можете использовать этот синтаксис с помощью чего-то очень похожего на следующее

$subquery = $this->_datawarehouse->select()
            ->from('revenueLog')
            ->where('Date '.$ReturnDate)
            ->order('Date DESC');

        $this->view->end = microtime();
        $format = new Zend_Db_Expr('DATE_FORMAT(`Date`,"%d-%m-%y")');
        $select = $this->_datawarehouse->select()
                ->from(array('subquery'=>$subquery))
                ->group('Client')
                ->group($format)
                ->order('Vertical ASC')
                ->order('Revenue DESC');

        echo $select->__ToString();
        $stmt = $this->_datawarehouse->query($select);
        $data = $stmt->fetchAll();

для тех, кто интересуется, $ ReturnDate - это строка, основанная на пользовательском вводе, которая обычно заканчивается как "МЕЖДУ" date1 "И" date2 ""

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...