2009-08-27 10 views
27

Sto riscontrando dei problemi nel trasformare l'SQL in basso in una query Zend Db.Scrittura di una sottoquery tramite 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'; 

Ho ottenuto fino al codice prima - ma Zend Db non sta producendo correttamente la query. Qualcuno può mostrarmi cosa mi manca ??

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

L'SQL funziona comunque. Lo sto riscrivendo usando Zend Db come vorrei usare la funzionalità di Zend Paginator.

Qualsiasi aiuto è molto apprezzato.

PJ

+0

Che cos'è $ db ???? –

risposta

20

questo:

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

dà questo:

"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

Grazie Karim. Mi ci è voluto un po 'per capire cosa era diverso - era la partita id nella dichiarazione di where - stupido errore !! Ma bello sapere che non ero troppo lontano! – PJE

+1

@PJE - Non riuscivo a vedere quale fosse il problema guardando il tuo codice, ho creato la selezione da zero usando la tua query, e ora l'hai fatto notare! – karim79

31

se si vuole, si può prendere ciò che @ karim79 fatto e trasformare il vostro subselect in un $ this-> selezionare() pure ...

$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

Che cos'è $ db ???? –

+0

@PratikCJoshi, $ db è un'istanza Zend_Db_Table nella maggior parte dei casi. – Wolfeh

2

Ho avuto un problema molto simile e ho scoperto che questa query può essere facilmente scritto come segue:

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

E 'esattamente lo stesso che la gente ha già detto qui. Ma ho sentito che è un po 'più facile da leggere poiché le dipendenze sub-query sono più evidenti.

1

Ottima domanda! Grazie per questo. Anche voluto buttare fuori che se si sta cercando di fare un gruppo dopo un ordine, è anche possibile utilizzare questa sintassi da qualcosa di molto simile a quanto segue

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

per chiunque chiedendo $ ReturnDate è una stringa basata su un utente input, che di solito finisce con "BETWEEN" date1 "AND" date2 ""

Problemi correlati