Zend_Db_Select:在子查询上进行LEFT JOIN

3

我有一个查询,在子查询上执行了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。

现在,我无法使用Zend_Db_Select使LEFT JOIN on subselect起作用。我尝试了我能想到的一切,但它不起作用。


所以我的问题是:

  • 是否不可能使用Zend_Db_Select执行上述描述的查询?
  • 我需要什么语法才能让它在Zend Framework中起作用?
2个回答

8
我认为它应该像这样工作:
$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())

我还没有尝试过,但我相信它会起作用。

这是否意味着它需要实际执行两个查询? - Jacco
1
不,它只会生成一个查询。Zend_Db_Select只是一个流畅的包装器,用于创建查询。它包含方法toSting()__toString()。您可以尝试调用类似die($select)的一些调试代码,它将以您使用的数据库方言打印查询。 - Jakub Truneček
1
伟大的new Zend_Db_Expr('('.$subselect.')')是关键,在Magento上也非常有用! - WonderLand
谢谢 - 非常有帮助 - 最后一行第一个数组缺少闭合括号 - 应该是:->joinLeft(array('c' => new Zend_Db_Expr('('.$subselect.')')), 'c.pkey = a.ukey', array()) - 无法编辑,因为SO要求修改超过6个字符。 - goredwards

1

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

...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接