将一个结果集与另一个表zf2连接

时间:2012-10-22 11:30:32

标签: php zend-db zend-framework2

我做了以下功能,并且工作正常。

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;
    }

我将使用相同的表加入上面的select语句。任何人都可以建议如何做到这一点?我目前的实施如下。实际上还没有完成。因为缺乏实施它的知识。

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;

任何人都可以提供良好的反馈,会有所帮助。

感谢。

2 个答案:

答案 0 :(得分: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->来自()的关联数组,像这样;

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

答案 1 :(得分:1)

ZF2的Zend\Db\Sql\Select - 在我写这篇文章时 - 缺乏$select->join()中子查询的支持。您只能在$select->columns()& $select->where()(带表达式)。

修改

只有$select->join()不支持子查询,$select->from()接受它。这意味着整个子查询现在被引用为标识符 - 可能它将被修复为某些2.0。*版本。