2011-09-14 5 views
3

Я пытаюсь вернуть количество заказов на каждый день, когда сайт коммерции был в режиме реального времени, но в течение дней, когда было 0 заказов, моя инструкция sql возвращает null, и, следовательно, их пробел в данные. Как я могу вставить 0 в эти дни, чтобы данные были завершены?Группа MySQL по дате для значений NULL

$sql = "SELECT COUNT(*) AS orders 
     FROM `orders` 
     GROUP BY DATE(`order_datetime`) 
     ORDER BY DATE(`order_time`) ASC"; 

    $query = $this->db->query($sql); 

Я попытался с помощью IFNULL вроде так, но я получаю тот же результат, что и выше:

$sql = "SELECT ifnull(COUNT(*),0) AS orders 
     FROM `orders` 
     GROUP BY DATE(`order_datetime`) 
     ORDER BY DATE(`order_time`) ASC"; 

    $query = $this->db->query($sql); 
+0

http://stackoverflow.com/questions/3538858/mysql-how-to-fill-missing-dates-in-range –

ответ

1

вы можете использовать COALESCE?

например:

SELECT COALESCE(COUNT(*),0) AS orders 
FROM `orders` 
GROUP BY DATE(`order_datetime`) 
ORDER BY DATE(`order_time`) ASC 

возвращает первое не нулевое значение в списке - рассчитывать, если его не утратившие 0, если оно есть.

http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce

повесить на .. это вопрос, что нет ни одной строки с этими датами так что вы просто получить результаты для этих дат?

если так можно вернуть дату заказа тоже и быть немного более умным о том, как вы показываете свой результат:

SELECT order_datetime,COUNT(*) AS orders 
FROM `orders` 
GROUP BY DATE(`order_datetime`) 
ORDER BY DATE(`order_time`) ASC 

то при выводе результатов возможно создать цикл, который перебирает дату вы заинтересованы в и печатает 0, если нет строки для этой даты:

for (datetime d = startdate; d <= enddate; datetime.adddays(1)){ 
    if (recordset[order_datetime] == d){ 
     output (d,recordset[orders]); 
     recordset.movenext(); 
    }else 
    { 
     output (d,0); 
    } 
} 

(обратите внимание, я понятия не имею, что язык программирования, который будет ;-)

, если вы хотите сделать все это в БД, тогда посмотрите на этот СОСТОЙ вопрос о том, как создать таблицу дат «на лету», а затем вы можете оставить внешнее соединение от него к вашему запросу на дату.

Get a list of dates between two dates

+0

не пробовал объединиться для этого, так что не знаю точно, как он будет себя вести здесь – gordatron

+0

или если у вас есть все даты, которые вас интересуют в другой таблице, вы можете оставить внешнее соединение от него к вашему запросу .. или вы можете создать эту таблицу «на лету» и присоединиться к ней .. но зачем беспокоиться? – gordatron

+0

ya Я думаю, что гораздо легче справиться с отсутствующими датами за пределами sql –

0

вы должны выбрать все даты, которые вы хотите вручную в подзапрос и LEFT JOIN его с таблицей:

SELECT COUNT(*) AS orders FROM 
    (SELECT '2010-09-01' AS date UNION SELECT '2010-09-02' UNION 
    SELECT '2010-09-03' UNION SELECT '2010-09-04' UNION SELECT '2010-09-05' UNION 
    SELECT '2010-09-06' UNION SELECT '2010-09-07' ...) AS dates 
    LEFT JOIN orders ON(dates.date = orders.order_datetime) 
    GROUP BY orders.order_datetime 
    ORDER BY orders.order_datetime 

или использовать вас текущий запрос и заполнить пробелы в вашей PHP программы после получения Результаты.

+0

ya это довольно солидный способ справиться с этим, но я думаю, что просто обрабатывать отсутствующие даты вне sql. Спасибо за помощь! –

+0

как лежать, присоединяйся к этому для нескольких ID ??? поэтому в ту же дату будут отображаться две данные с разными идентификаторами? –

Смежные вопросы