2011-11-16 35 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。它會是這個樣子(添加GROUP BY條款簡化):

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

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

要添加GROUP BY條款,只要做到這一點(或使用方法鏈接見上面的例子):

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

謝謝Phil的幫助!

+0

問題的正確位置,不正確的解決方案 – Phil

+0

感謝,date_format(NOW(),'%​​Y-%m-%d')將給今天的日期。所以我需要通過'%Y-%m-%d' – mymotherland

+0

@Phil哎呀!你真的很棒。感謝您的高舉。現在仔細檢查它? –