left-joinzend-dbsubqueryzend-db-select

Zend_Db_Select: LEFT JOIN on a subselect


I have a query, that does a LEFT JOIN on a subselect. This query is run in a high load environment and performs within the set requirements. The query (highly simplified) looks like:

SELECT
  table_A.pKey
, table_A.uKey
, table_A.aaa
, table_B.bbb
, alias_C.ccc
, alias_C.ddd
FROM table_A
INNER JOIN table_B ON table_A.pKey = table_B.pKey
LEFT JOIN (

    SELECT
      table_X.pKey
    , table_X.ccc
    , table_Y.ddd
    FROM table_X
    INNER JOIN table_Y ON table_X.pKey = table_Y.pKey

  ) AS alias_C ON table_A.uKey = alias_C.pKey;

(for various reasons, it is not possible to rewrite the subselect as a (direct) LEFT JOIN).

Now, I cannot get the LEFT JOIN on subselect to work with Zend_Db_Select. I've tried everything I could come up with, but it does not work.


So my question is:


Solution

  • I think that it should work like this:

    $subselect = $db->select->from(array('x' => 'table_X'), array('x.pKey', 'x.ccc', 'y.ddd'), 'dbname')
                            ->join(array('Y' => 'table_Y'), 'x.pkey = y.pkey', array(), 'dbname');
    
    $select = $db->select->from(array('a' => 'table_A'), array(/*needed columns*/), 'dbname')
                         ->join(array('b' => 'table_B'), 'a.pkey = b.pkey', array(), 'dbname')
                         ->joinLeft(array('c' => new Zend_Db_Expr('('.$subselect.')'), 'c.pkey = a.ukey', array())
    

    I haven't tried it but I believe it'll work.