2009-08-27 56 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'」