0

我正在尝试使用 Zend_Db_Select 编写以下查询:

SELECT p1.SKU,
(
 SELECT ',' + Status
 FROM "Products" "p2"
 WHERE p2.SKU = p1.SKU
 ORDER BY "Status"
 FOR XML PATH ('')
)  AS "Statuses"
FROM "Products" p1
GROUP BY SKU

这是我到目前为止所拥有的:

$s1 = $products->select()
               ->setIntegrityCheck(false)
               ->from(array('p2' => 'Products'),
                      new Zend_Db_Expr("',' + Status")
                 )
               ->where('p2.SKU = p1.SKU')
               ->order('Status');

$s2 = $products->select()
               ->from(array('p1' => 'Products'),
                      array('p1.SKU',
                            'Statuses' => new Zend_Db_Expr('(' . $s1 . ')')
                      )
                 )
               ->group('SKU');

echo $s2;
$dbRowSet = $Products->fetchAll($s2);

这给了我这个:

SELECT "p1"."SKU",
(
 SELECT ',' + Status
 FROM "Products" AS "p2"
 WHERE (p2.SKU = p1.SKU)
 ORDER BY "Status" ASC
) AS "Statuses"
FROM "Products" AS "p1"
GROUP BY "SKU"

我不知道如何获得所需的FOR XML PATH ('').

此外,不使用.带有$s1调用的运算符__toString(),而不是将其保留为本机 Zend_Db_Select 对象。有没有其他方法可以得到parens $s1

或者,是否有另一种方法来完成整个查询?我想返回每个 SKU 和所有状态的串联分组(GROUP_CONCAT()在 MySQL 中)。该表很大,因此在 PHP 中迭代它们需要非常长的时间。

4

2 回答 2

0

不幸的是,Zend Framework 对构建 MS SQL 特定查询没有很好的支持。您可以做的是完全使用Zend_Db_Adapter_Abstract::query()并跳过面向对象的查询抽象。或者,您可以扩展Zend_Db_Select,将适当的代码添加到Zend_Db_Select::$_partsand Zend_Db_Select::_render*,但是您仍然会得到不完整的支持。

我不太明白您在第二个代码示例中到底在做什么,因为$2根本没有分配变量。

用于字符串构造__toString()时不用担心被调用;.无论哪种方式,表达式最终都会进行字符串转换。

于 2012-12-04T07:13:10.123 回答
0

看起来我很接近,并且考虑到 KSiimson 关于字符串转换的评论,这很有效:

$s1 = $products->select()
               ->setIntegrityCheck(false)
               ->from(array('p2' => 'Products'),
                      new Zend_Db_Expr("',' + Status")
                 )
               ->where('p2.SKU = p1.SKU')
               ->order('Status');

$s2 = $products->select()
               ->from(array('p1' => 'Products'),
                      array('p1.SKU',
                            'Statuses' => new Zend_Db_Expr('(' . $s1 .
                                " FOR XML PATH(''))")
                      )
                 )
               ->group('SKU');

echo $s2;
$dbRowSet = $Products->fetchAll($s2);

这只是将 FOR XML PATH 子句与第一个查询作为字符串连接起来。没有我希望的那么优雅,但“完美是善的敌人”。

于 2012-12-21T17:03:32.790 回答