2011-11-18 11 views
5

In sql sto usando union non so come scriverlo in zend db.Come usare union 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 ....

Ho provato come questo, ma non serve

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

E sta prendendo 'test'. '0' AS 'is_shared' come questo, ma ho bisogno di questo 0 come is_shared. Sta prendendo 'test'. '1' AS 'is_shared' come questo, ma ho bisogno di questo come 1 is_shared.

risposta

8

Non so il nostro SQL è il lavoro. Ma può fare il seguente codice.

$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*/ 
1

Secondo il Zend_Db_Select documentation, è possibile creare una query per ogni membro del sindacato (possono essere stringhe o Zend_Db_Select oggetti stessi), e quindi chiamare il metodo di Zend_Db_Selectunion().

Qualcosa di simile:

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

Speranza che aiuta,

2

Per riferimento futuro, in Zend Framework 2.3 questo è fatto con combine.

Ad esempio:

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); 
Problemi correlati