2009-08-27 11 views
27

SQL'in bir Zend Db sorgusuna dönüştürülmesiyle ilgili bazı sorunlar yaşıyorum.Zend DB kullanarak bir alt sorgu yazma 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'; 

Önceden kod kadar var - ama Zend Db sorguyu doğru şekilde üretmiyor. Kimse eksik olduğumu bana gösterebilir mi?

$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 bu arada çalışıyor. Zend Paginator işlevselliğini kullanmak istediğim gibi Zend Db kullanarak yeniden yazarım.

Her türlü yardım büyük beğeni topluyor.

PJ

+0

$ db nedir ???? –

cevap

20

Bu: İsterseniz

"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

Teşekkürler Karim. Ne farklı olduğunu öğrenmek için bir süre sürdü - nerede iddianın deyimiydi - aptalca hata! Ama bilmek güzel, çok uzak değildim! – PJE

+1

@PJE - Sorunun kodunuza bakarak ne olduğunu göremedim, sorgunuzu kullanarak seçiminizi sıfırdan oluşturdum ve şimdi bunu gördüğüme işaret ettiniz! – karim79

31

, sen karim79 @ yaptıklarını alabilir ve seçmek bir $ this-> içine Alt Seç'i çevirmek:

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

bu verir() aynı zamanda ...

$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 nedir ???? –

+0

@PratikCJoshi, $ db çoğu durumda bir Zend_Db_Table örneğidir. – Wolfeh

2

Ben çok benzer bir sorun vardı ve ben şöyle bu sorgu kolayca yazılabilir bulundu: insanlar zaten burada ifade etmiştir

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

Bu tamamen aynıdır. Ancak alt sorgu bağımlılıkları daha belirgin olduğundan, okunması biraz daha kolay olduğunu hissettim.

1

Harika soru! Bunun için teşekkür ederim. Ayrıca bir sipariş sonra bir grup yapmaya çalışıyorsanız, ayrıca kullanıcıya göre $ Geri gönderme merak herkes için

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

aşağıdaki bir dizeye çok benzer bir şey tarafından bu sözdizimini kullanabilirsiniz dikkat atmak istedi genellikle "BETWEEN" date1 'VE' date2 'olarak biten girdi, "