2011-01-12 5 views
4

と同じ名前を持つ別名順:ドクトリン:私はDQL(Doctrine1.2)を以下しているコラム

$dql->select('sum(t.column1) column1, t.column2') 
    ->from('Table t') 
    ->groupBy('t.column2') 
    ->orderBy('t.column1'); //Ordered by column1 not by sum(t.column1) 

は、次のとおりです。

$dql->select('sum(t.column1) column1, t.column2') 
    ->from('Table t') 
    ->groupBy('t.column2') 
    ->orderBy('column1'); 

しかし、生成されたSQLは、次のDQLのためのように同じですDoctrineに列名t.column1の代わりに別名column1を使用させることができますか?

非常に似ている2つのDQLのモデルから同じ出力形式を使用したいので、これが必要です。 (最近、同じテンプレートによってレンダリングされます)。他のDQLは次のようになります。

$dql->select('t.column1, t.column2') 
    ->from('Table t') 
    ->orderBy('t.column1'); 

可能性のある問題を回避するには、二回sum(t.column1)を選択することです。最初にエイリアスcolumn1で2度目の別名で、なぜpasswdの後にorderBy関数になっているのですが、最も明白な解決策のようには見えません。

提案がありますか?

ありがとうございました

答えて

5

この方法をお試しいただけますか?ただ、代わりにエイリアスを使用しようとすると、順に "合計(t.column1)" に置く:

$dql->select('sum(t.column1) as column1, t.column2') 
    ->from('Table t') 
    ->groupBy('t.column2') 
    ->orderBy('sum(t.column1)'); 
+0

これは動作しますが、SQLに 'SUM(t.columnt1)BY' ORDERを生成します。列を2回選択するよりも優れていますが、これが最善の解決策ですか? SQLオプティマイザはそれを認識して 'sum(t.column1) 'を1回だけカウントしますか? –

+1

@Petrはい、かなりクレイジーなDBバックエンドを使用している場合を除きます。それは昔ながらのSQLイディオムであり、現代のエンジンはすべて、あなたがやっていることを認識し、正しく最適化します。 MySQLは確かにうまくいくでしょう。 –

関連する問題