2009-08-27 128 views
27

我在将下面的SQL转换为Zend Db查询时遇到了一些问题。使用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

+0

什么是$ db? – 2016-01-28 13:34:37

回答

20

此:

$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" 
+0

谢谢卡里姆。我花了一段时间才弄清楚什么是不同的 - 这是在哪里声明的id匹配 - 愚蠢的错误!但很高兴知道我不是太遥远! – PJE 2009-08-27 12:36:13

+1

@PJE - 我看不到你的代码出现了什么问题,我使用你的查询从头开始构建了选择,现在你已经指出了我看到它! – karim79 2009-08-27 12:45:31

31

,如果你愿意,你可以采取什么样的@ karim79做了,把你的子查询到$这个 - >选择()以及...

$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 
+0

什么是$ db? – 2016-01-28 13:34:32

+0

@PratikCJoshi,在大多数情况下,$ db是一个Zend_Db_Table实例。 – Wolfeh 2016-06-30 08:23:34

2

我有一个非常类似的问题,我发现这种查询可以很容易地写为:

$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

伟大的问题!谢谢你这个。也想扔出去,如果你正在尝试订单后做1组,还可以通过非常类似于以下

$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是一个字符串基于用户的一些使用该语法输入,其通常结束为“BETWEEN'date1'和'date2'”