如何在zend db中使用联合


How to use union in zend db

在sql中,我使用联合,我不知道如何在zend db中编写。

select m.*, 0 as is_shared from test m where user_id = $userId 
union
select m.*,1 as is_shared from test m 
join test_shares ms 
where m.test_id = ms.test_id 
and ms.email_address = $email 
and m.url is not null;

请帮帮我....

我试过了,但是没有用

$cols1 = array('test.*,0 as is_shared');
$select1 = $db->select ()
    ->from ( 'test', $cols1 )
    ->where ( 'user_id = ?', $userId);
$cols2 = array('test_shares.*', '1 as is_shared');
$select2 = $db->select ()
    ->from ( 'test', $cols2 )
    ->join ( 'test_shares', array () )
    ->where ( 'test.test_id = test_shares.test_id')
    ->where ( 'test_shares.email_address = ?',  $email)
    ->where ( 'test.url is NOT NULL');
$select = $db->select()
             ->union(array($select1, $select2))
             ->order('title');

它正在取'test'。'0' AS 'is_shared'像这样,但我需要这样的0作为is_shared。它正在进行"测试"。'1' AS 'is_shared'就像这样,但我需要像这样的1作为is_shared

我不知道我们的sql是工作。但它可以生成以下代码。

$userId = 10;
$email = 'bbsdf@sdf.sd';
$select1 = $db->select()
                ->from(array('m' => 'test'), array('*', '0 AS is_shared'))
                ->where('user_id =?', $userId);
$select2 = $db->select()
                ->from(array('m' => 'test'), array('*', '1 AS is_shared'))
                ->join(array('ms' => 'test_shares'), 'm.test_id = ms.test_id', '')
                ->where('ms.email_address =?', $email)
                ->where('m.url IS NULL');                  
$select = $this->select()
     ->union(array($select1, $select2))
     ->order('title');
echo $select; die;
        /*SELECT `m`.*, `m`.`0` AS `is_shared` 
         * FROM `test` AS `m` 
         * WHERE (user_id =10) 
         * UNION 
         * SELECT `m`.*, `m`.`1` AS `is_shared` 
         * FROM `test` AS `m` 
         * INNER JOIN `test_shares` AS `ms` 
         * ON m.test_id = ms.test_id 
         * WHERE (ms.email_address ='bbsdf@sdf.sd') AND (m.url IS NULL) 
         * ORDER BY `title` ASC*/

为了将来的参考,在Zend Framework 2.3中,这是通过combine来完成的。

例如:

    use 'Zend'Db'Sql'Select;
    use 'Zend'Db'Sql'Sql;
    $sql = new Sql(/* ADAPTER HERE */);
    $tag1 = new Select( ['a' => 'articles'] );
    $tag1->columns( [ 'tag' => 'first_tag'] );
    $tag1->where->in('a.id', $articleIds);
    $tag2 = new Select( ['a' => 'articles'] );
    $tag2->columns( [ 'tag' => 'second_tag'] );
    $tag2->where->in('a.id', $articleIds);
    $tag2->combine($tag1);
    $tag3 = new Select( ['a' => 'articles'] );
    $tag3->columns( [ 'tag' => 'third_tag'] );
    $tag3->where->in('a.id', $articleIds);
    $tag3->combine($tag2);
    $statement = $sql->prepareStatementForSqlObject($tag3);

根据Zend_Db_Select文档,您可以为联合的每个成员创建一个查询(它们可以是字符串或Zend_Db_Select对象本身),然后调用Zend_Db_Selectunion()方法。

类似:

$sql1 = FIRSTPARTOFTHEQUERY;
$sql2 = SECONDPARTOFTHEQUERY;
$select = $db->select();
$select->union(array($sql1, $sql2));

希望有帮助,