2012-10-22 3 views
0

다음 함수를 수행했는데 정상적으로 작동합니다.하나의 결과 집합을 다른 테이블에 결합하십시오. zf2

public function getLatestCurrencyRates(){ 
     $sql = new Sql($this->adapter); 

     $subselect2 = $sql->select(); 
     $subselect2->from(array('r1' =>'currency_rates')) 
        ->columns(array('max_c_rate_id' => new Expression('MAX(c_rate_id)'))) 
        ->group("currency_id"); 


     $statement = $sql->prepareStatementForSqlObject($subselect2); 
     $result = $statement->execute(); 
     $rows = array_values(iterator_to_array($result)); 
     return $rows; 
    } 

위의 선택 진술과 같은 테이블을 사용하려고합니다. 누구든지 그 방법을 제안 할 수 있습니까? 내 현재 구현은 다음과 같습니다. 사실 그것은 완료되지 않았습니다. 지식의 부족 때문에 그것을 구현합니다.

public function getLatestCurrencyRates(){ 
     $sql = new Sql($this->adapter); 

     $subselect2 = $sql->select(); 
     $subselect2->from(array('r1' =>'currency_rates')) 
        ->columns(array('max_c_rate_id' => new Expression('MAX(c_rate_id)'))) 
        ->group("currency_id"); 


     $subselect3 = $sql->select(); 
     $subselect3->from("currency_rates") 
        ->join(array('r2'=>$subselect2), 'r2.max_c_rate_id = currency_rates.c_rate_id', array('c_rate_id', 'currency_id', 'buy_rate', 'sell_rate')); 



     $statement = $sql->prepareStatementForSqlObject($subselect3); 
     $result = $statement->execute(); 
     $rows = array_values(iterator_to_array($result)); 
     return $rows; 
    } 

여기서는 다음과 같이 구현할 SQL 쿼리입니다.

select r1.c_rate_id, r2.currency_id, r2.buy_rate, r2.sell_rate 
from 
(select max(c_rate_id)as c_rate_id from currency_rates group by currency_id) as r1 
inner join 
currency_rates as r2 
on 
r1.c_rate_id = r2.c_rate_id; 

아무도 좋은 의견을 제공 할 수 있습니까?

감사합니다.

답변

1

ZF2의 Zend\Db\Sql\Select -이 글을 쓰는 순간 서브 쿼리의 지원이 $select->join()으로 부족합니다. $select->columns() & $select->where() (표현식 포함)에서만 사용할 수 있습니다.

편집 :

$select->join() 하위 쿼리의 지원이 부족, $select->from() 그것을 받아들입니다. 하위 쿼리 전체가 식별자로 인용된다는 것을 의미합니다. 아마도 2.0. * 버전에서 수정 될 것입니다.

+0

나는 그것이 하위 쿼리를 지원한다고 생각한다. 이 예제 (https://github.com/ralphschindler/Zend_Db-Examples/blob/master/example-20.php)에는이를 수행하는 방법이 나와 있습니다. 하지만 질문은 결과 집합과 동일한 테이블을 다시 조인하는 방법이었습니다. 내 질문에 SQL 문을 편집했습니다. Pls에는 모양이 있습니다 .. – cha

+0

왜냐하면'$ select-> where'에서 사용하기 때문에 제가 작성한 것처럼 – pozs

+0

미안합니다. 그러나 지금 나는 그것을했다. 답장을 보내 주셔서 감사합니다. 당신이 괜찮 으면, pls 좀 더 자세히 설명 할 수 있습니까? – cha

2

마지막으로 해 보았습니다.

public function getLatestCurrencyRates(){ 
     $sql = new Sql($this->adapter); 

     $subselect2 = $sql->select(); 
     $subselect2->from(array('r1' =>'currency_rates')) 
        ->columns(array('max_c_rate_id' => new Expression('MAX(c_rate_id)'))) 
        ->group("currency_id"); 


     $subselect3 = $sql->select(); 
     $subselect3->from(array('r2' => $subselect2)) 
        ->join("currency_rates", 'max_c_rate_id = currency_rates.c_rate_id', array('c_rate_id', 'currency_id', 'buy_rate', 'sell_rate'));  

     $statement = $sql->prepareStatementForSqlObject($subselect3); 
     $result = $statement->execute(); 
     $rows = array_values(iterator_to_array($result)); 
     return $rows; 
    } 

저는 $ select-> from()와 같은 연관 배열을 통과 시켰습니다.

$subselect3->from(array('r2' => $subselect2)) 
        ->join("currency_rates", 'max_c_rate_id = currency_rates.c_rate_id', array('c_rate_id', 'currency_id', 'buy_rate', 'sell_rate')); 
관련 문제