4

これはZendFrameworkでは不可能だと確信しています(Web、ドキュメント、および問題追跡システムを検索しました)が、確認したいので、ここで質問します。

$select = $this->select();
$select->union($select1, $select2);

もちろん、それは機能しません。私が必要なものを説明するために。UNION()を使用してSELECTクエリで2つのテーブルをマージする必要がありますが、次のことができると思います。

$select = "$select1 UNION $select2";

問題は、文字列を返すことであり、Zend_Paginatorで使用できるようにselectオブジェクトを取得する必要があります。

私はすでにデータベースアーキテクチャを変更することで問題を解決しましたが、これに対する回避策があるかどうかだけ知りたいです。

4

6 に答える 6

13

組合を作るために私がやったことは次のとおりです。

$select = $this->select();
//common select from both sides of the union goes here

$select1 = clone($select);
//select1 specifics here

$select2 = clone($select);
//select 2 specifics here

$db = $this->getAdapter();
$pageselect = $db->select()->union(array("($select1)", "($select2)"));

は、デバッグに役立つように、その選択によって生成された SQL を出力することをDb_Select覚えておいてください。__toString

于 2009-08-24T14:39:43.463 に答える
7

Zend_Db_Selectにはユニオン メソッドがあるため、select オブジェクトを使用してクエリを作成できれば、可能だと思いました。Zend_Db_Select (またはテーブルのサブクラス) をユニオンで使用したことはありませんが、次のようなことができると思います

$select = $this->select()
               ->where('blah')
               ->union($sql);
于 2009-08-23T21:34:37.977 に答える
4

完全な例:

 public function getReservationById($id)
 {
  if(!$id) return null;

  $sql = $this->table->select();
  $sql->union(array(
   $this->table->select()->where('id=?', $id),
   $this->tableFinished->select()->where('id=?', $id),
   $this->tableCanceled->select()->where('id=?', $id),
   $this->tableTrashed->select()->where('id=?', $id)
   ));
  echo $sql->__toString();
 }

および生成されたクエリ:

SELECT reservations.* FROM reservationsWHERE (id='5658') UNION SELECT res_finished.* FROM res_finishedWHERE (id='5658') UNION SELECT res_cancel.* FROM res_cancelWHERE (id='5658') UNION SELECT res_trash.* FROM res_trashWHERE (id='5658' )

于 2010-10-29T11:38:58.303 に答える
3

この実用的な例は、最新の行セット、または特定の年の利用可能なお気に入りのブログ エントリ (アートワーク ブログ) の行セットを返す関数を示しています。

public function fetchBestOf($year)
{
    $selectLatest = $this->select()->where('isHidden = 0')
                                   ->where('YEAR(dateCreated) = ' . $year)
                                   ->where('isHighlight = 0');
    $selectHighlights = $this->select()->where('isHidden = 0')
                                       ->where('YEAR(dateCreated) = ' . $year)
                                       ->where('isHighlight = 1');

    $selectUnion = $this->select()->union(array($selectLatest, $selectHighlights), Zend_Db_Select::SQL_UNION_ALL)
                   ->order('isHighlight DESC')
                   ->order('dateCreated DESC')
                   ->order('workID DESC')
                   ->limit('5');

    $rowset = $this->fetchAll($selectUnion);
    return $rowset;
}
于 2011-11-21T13:46:56.777 に答える
2

Zendが提案する最良の方法は次のようなものです。

$sql = $this->_db->select()
    ->union(array($select1, $select2,$select3))
            ->order('by_someorder');

echo $sql->__toString();

$stmt = $db->query($sql);
$result = $stmt->fetchAll();

エコーはクエリを表示します

ここで、$ select1、$ select2、$ select3は、同じ列数の異なる選択クエリにすることができます。

于 2012-05-22T13:34:26.493 に答える
1

これは私にとってどのように機能するかです:

$select1 = $this->select();               
$select2 = $this->select();

両方のクエリで必要なデータを取得した後、UNION 構文は次のようになります。

 $select = $this->select()->union(array('('.$select1.')', '('.$select2.')'));  
于 2012-07-20T13:01:49.620 に答える