Zend_Db_Select: LEFT JOIN на подвыбор - PullRequest
3 голосов
/ 12 июля 2011

У меня есть запрос, который делает LEFT JOIN для подвыбора.Этот запрос выполняется в среде с высокой нагрузкой и выполняется в соответствии с установленными требованиями.Запрос (сильно упрощенный) выглядит следующим образом:

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;

(по разным причинам невозможно перезаписать подвыбор как (прямое) LEFT JOIN).

Теперь я не могу заставить LEFT JOIN on subselect работать с Zend_Db_Select.Я перепробовал все, что мог придумать, но это не работает.

Итак, мой вопрос:

  • Разве невозможно выполнить запрос, как описано выше, с Zend_Db_Select?
  • Какой синтаксис мне нужен, чтобы заставить его работать в Zend Framework?

Ответы [ 2 ]

8 голосов
/ 12 июля 2011

Я думаю, что это должно работать так:

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

Я не пробовал, но я верю, что это будет работать.

1 голос
/ 18 июля 2011

... -> joinLeft (array ('c' => new Zend_Db_Expr ('('. $ subselect-> assembly (). ')'), 'c.pkey = a.ukey', array ())

...