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

また、ネイティブのZend_Db_Selectオブジェクトとして残す代わりに、呼び出しで.演算子を使用していません。両親を連れて行く他の方法はありますか?$s1__toString()$s1

または、このクエリ全体を実行する別の方法はありますか?各SKUと、すべてのステータスの連結グループ(GROUP_CONCAT()MySQLの場合は1つ)を返します。テーブルは巨大であるため、PHPでそれらを反復処理するのに許容できないほど長い時間がかかります。

4

2 に答える 2

0

残念ながら、Zend Frameworkは、MSSQL固有のクエリを構築するための優れたサポートを備えていません。あなたができることはZend_Db_Adapter_Abstract::query()、オブジェクト指向のクエリ抽象化を完全に使用してスキップすることです。または、を拡張しZend_Db_Select、適切なコードをに追加するZend_Db_Select::$_partsこともできZend_Db_Select::_render*ますが、それでもサポートは不完全です。

$2変数がまったく割り当てられていないため、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);

これは、FORXMLPATH句を文字列としての最初のクエリと連結するだけです。私が望んでいたほどエレガントではありませんが、「完璧は善の敵です」。

于 2012-12-21T17:03:32.790 に答える