4

我很确定这在 Zend Framework 中是不可能的(我已经搜索了 Web、文档和问题跟踪器),但我只是想确定一下,所以我在这里问。

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

那当然行不通。解释我需要什么。我需要使用 UNION() 在 SELECT 查询中合并 2 个表,我知道我可以这样做:

$select = "$select1 UNION $select2";

问题是它会返回一个字符串,我需要获取一个选择对象,以便可以将它与 Zend_Paginator 一起使用。

我已经通过修改我的数据库架构解决了这个问题,但我只是好奇是否有一些解决方法。

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

请记住Db_Select__toString将打印出该选择生成的 SQL,以帮助您调试。

于 2009-08-24T14:39:43.463 回答
7

Zend_Db_Select有一个联合方法,所以我认为这是可能的,如果您可以使用选择对象构建您的查询。我没有将 Zend_Db_Select (或表子类)与 union 一起使用,但我想你可以做类似的事情

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

echo 将显示查询

这里 $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 回答