2009-08-27 30 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 Paginatorの機能を使いたいので、Zend Dbを使って書き直しています。

ご協力いただきまして誠にありがとうございます。

PJ

+0

$ dbとは何ですか? –

答えて

20

は、この:あなたがしたい場合

"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

+1

@PJE - あなたのコードを見ることで問題が何かを知ることができませんでした。私はあなたのクエリを使って最初からselectを作りました。そして今、あなたはそれを私が見ていることを指摘しました! – karim79

31

、あなたがkarim79 @何をしたか取ることができ、選択します$ this->にあなたの副選択を回す:

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

は、この与えます()...

$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とは何ですか? –

+0

@PratikCJoshi、$ dbはほとんどの場合Zend_Db_Tableインスタンスです。 – Wolfeh

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

大きな質問!これはありがとうございます。また、ご注文後にグループをやろうとしている場合、あなたはまた、ユーザーに基づいて$ ReturnDateを思って誰のための

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

される次の文字列に非常によく似たもので、この構文を使用することができることを投げると思いました入力は通常「BETWEEN」の日付1と日付2になります。

関連する問題