2011-11-16 2 views
2

にオペレータ間のSQLを実装する方法を私の最後の5ヶ月で起こった総受注販売を算出し、次のクエリは、Zend_Dbの

>  SELECT SUM(o.total), DATE(o.order_date) dateonly FROM `order` as o where (o.order_date BETWEEN last_day(NOW() - INTERVAL 5 MONTH) AND 
> date_format(NOW(), '%Y-%m-%d') AND (o.order_status = "P" OR 
> o.order_status = "T" OR o.order_status = "S" OR o.order_status = "D" 
>)) GROUP BY month(o.order_date) 

私はZendの中のクエリの上に実装しようとしていますがあります。しかし、私は真ん中にこだわった。 私はモデル/ DBTABLE、

class Default_Model_DbTable_Order extends Zend_Db_Table_Abstract 
{ 
    protected $_name = 'order'; 
    protected $_primary = 'order_id'; 
    public function month_based_orderlist() 
    { 
     $oDb = Zend_Registry::get("db");   
     $whereSQL = 'o.order_id > 0'; 
     $whereSQL .= ' AND o.status = 1'; 
     $whereSQL .= ' AND o.order_date BETWEEN last_day(NOW() - INTERVAL 5 MONTH) AND date_format(NOW(),'.%Y-%m-%d.')'; 
     $whereSQL .= ' AND o.order_status = "P"'; 
     $whereSQL .= ' OR o.order_status = "T"'; 
     $whereSQL .= ' OR o.order_status = "S"'; 
     $whereSQL .= ' OR o.order_status = "D"'; 
     $select = $oDb->select() 
      ->from(
       array('o' => $this->_name), 
       array(
        'lifetimesale' => new Zend_Db_Expr('SUM(o.total)'), 
        'dateonly' => DATE('o.order_date') 
       ) 
      )->where($whereSQL); 

     //echo $select; exit; 
     $result = $this->getAdapter()->fetchAll($select); 
     // print_obj($result); 
     return $result;    

    } 
} 
?> 

から取られたコードを持っている私は、私はこの上間違って行って何を、上記のようなSQLクエリを実装しようとしています。 親切にバグがここにある。この

+1

より具体的にする必要があります。どうやって「つぶれた」のですか?あなたが受け取ったエラーを投稿できますか?また、この問題がzendを処理しなければならないと考えるなら、そのコードも投稿してください。 –

+0

どうか問題を説明してください。 Zend_Dbを使用していますか? – Oleg

+0

@Digital Precision今すぐ私の質問が更新されました。 – mymotherland

答えて

2

に私を助ける:

.%Y-%m-%d. 

編集

フィルは私の解決策が間違っていたと指摘しました。私は再確認し、彼は正しかった。あなたは、バックスラッシュを使用して、単一引用符をエスケープでき、また

// assume $date is set 
$whereSQL .= ' AND o.order_date BETWEEN last_day(NOW() -' 
      . ' INTERVAL 5 MONTH) AND date_format(NOW(), "%Y-%m-%d")'; 

と刺すの連結演算子削除:ソリューションは、ダニを削除し、二重引用符で配置するだけであるべき

... date_format(NOW(), \'%Y-%m-%d\')'; 

はまた、私はあなたがZend_Db_Table_Abstractを拡張していると、など、あなたが行を必要としない参照してください。

$oDb = Zend_Registry::get('db'); 

これを省略して、代わりに$thisを使用してください。

$select = $this->select() 
    ->from($fromTable, $columns) 
    ->where($whereSQL) 
    ->group('month(o.order_date)'); 

$result = $this->fetchAll($select); 

単にこれを行う(またはメソッドチェーンを使用して上記の例を参照)、GROUP BY句を追加するには:そして、それは(GROUP BY句を追加して簡素化)は、このようになります

$select->group('month(o.order_date)'); 

ありがとうPhilお手数ですが!

+0

問題の場所が正しくありません。間違った解決 – Phil

+0

ありがとう、date_format(NOW()、 '%Y-%m-%d')は今日の日付を与えます。だから私は代わりに '%Y-%m-%d'を渡す必要があります – mymotherland

+0

@Phil Oops!あなたは上に座っています。ヘッドアップをありがとう。今すぐチェックしてみようか? –

関連する問題