Как реализовать sql между оператором в zend_db - PullRequest
2 голосов
/ 16 ноября 2011

У меня есть следующие запросы, которые подсчитывают общую продажу заказа за последние 5 месяцев,

>     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 Ответ

2 голосов
/ 16 ноября 2011

Ошибка здесь:

.%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")';

В качестве альтернативы, вы можете избежать одинарных кавычек, используя обратную косую черту, и удалить оператор sting concat:

... 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)');

Спасибо Фил за помощь!

...