2011-09-14 4 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

당신이 유착을 사용할 수 있습니까?

예 :

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

이 목록의 첫 번째 null 이외의 값을 반환합니다 -이 경우 0의 null가 아닌 경우 계산합니다.

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); 
    } 
} 

(난 것 아무 생각 어떤 프로그래밍 언어가없는주의가 ;-)

DB에서이 모든 작업을 원한다면 파리에서 날짜 테이블을 만드는 방법에 대한이 질문을 살펴보고 날짜에 대한 쿼리를 외부에서 조인 할 수 있습니다.

Get a list of dates between two dates

+0

정확히 일치하지 않으므로 정확하게 동작하지 않습니다. – gordatron

+0

또는 당신이 다른 테이블에 관심이있는 모든 날짜를 가지고 있다면 당신은 그것으로부터 당신의 질의에 대한 외부 조인을 남길 수 있습니다 .. 또는 당신은 그 테이블을 즉석에서 생성하고 그것에 참여할 수 있습니다. 그러나 왜 귀찮게합니까? – gordatron

+0

나중에 나는 SQL 밖에있는 누락 날짜를 처리하는 것이 훨씬 쉽다고 생각한다 –

0

당신은 하위 쿼리에서 수동으로 원하는 모든 날짜를 선택해야하며, 왼쪽은 테이블로 가입하십시오를받은 후 여러분의 PHP 프로그램의 격차를

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 

또는 당신에게 현재의 쿼리를 사용 및 채우기 결과.

+0

이것은 이것을 처리하기위한 매우 견고한 방법이지만, SQL 밖에없는 누락 된 날짜를 처리하는 것이 더 쉽다고 생각한다. 도와 주셔서 감사합니다! –

+0

여러 ID에 대해이 항목에 참여하는 방법 ??? 그래서 같은 날짜가 다른 ID와 두 개의 데이터를 표시합니다 ??? –