Search code examples
phpzend-frameworkzend-db

How to use union in zend db


In sql i am using union i don't know how to write it in 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;

Please help me out....

I tried like this but no use

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

It is taking 'test'.'0' AS 'is_shared' like this but i need like this 0 as is_shared. It is taking 'test'.'1' AS 'is_shared' like this but i need like this 1 as is_shared.


Solution

  • I don't know our sql is work. But it can make following code.

    $userId = 10;
    $email = '[email protected]';
    
    $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 ='[email protected]') AND (m.url IS NULL) 
             * ORDER BY `title` ASC*/