2013-11-03 3 views
2

안녕하세요 차트 표현을 위해 한 달을 기준으로 지난 12 개 개월 기록을 얻기 위해이 SQL 쿼리를 사용하고 있습니다 :MySQL의 합

그러나
SELECT DATE_FORMAT(drives.timestamp, "%b") AS Month, 
         DATE_FORMAT(drives.timestamp, "%d-%m-%Y %H:%i:%s") AS Exact_date, 
         drives.departure, 
         drives.destination, 
         drives.route, 
         CONCAT(drivers.name, " ", drivers.surname) as driver, 
         drivers.id as driver_id 
         FROM drives, drivers WHERE drives.driver = drivers.id 
         AND drives.timestamp > DATE_SUB(now(), INTERVAL 12 MONTH) ORDER BY drives.timestamp Asc 

에 대한 기록이없는 경우 예상 한대로 결과 집합에 포함되지 않은 한 달, 나는 내가 원하는 것을 성취하기 위해 PHP로 많은 계산을하고 있습니다.

내 질문은 다음과 같습니다. 지난 12 개월 동안 각 달의 드라이브 합계를 사용하여 간단한 결과 집합을 검색하는 방법이 있습니까? 또한 한 달에 0 드라이브가있는 경우 포함되어야합니다. 결과 집합입니다.

답변

3

매월 행이 포함 된 테이블로 외부 조인을 수행해야합니다. 당신은 이러한 테이블이없는 가정, 당신은 하드 코딩 UNION 쿼리와 함께 즉석에서 그것을 만들 수없는 기록을 가진

SELECT * FROM 
    (SELECT DATE_FORMAT(now(), "%b") as Month 
    UNION 
    SELECT DATE_FORMAT(now() - INTERVAL 1 MONTH), "%b") 
    UNION 
    SELECT DATE_FORMAT(now() - INTERVAL 2 MONTH), "%b") 
    UNION 
    ... 
    SELECT DATE_FORMAT(now() - INTERVAL 11 MONTH), "%b")) AS Months 
LEFT JOIN (SELECT DATE_FORMAT(drives.timestamp, "%b") AS Month, 
       drives.timestamp, 
       DATE_FORMAT(drives.timestamp, "%d-%m-%Y %H:%i:%s") AS Exact_date, 
       drives.departure, 
       drives.destination, 
       drives.route, 
       CONCAT(drivers.name, " ", drivers.surname) as driver, 
       drivers.id as driver_id 
       FROM drives, drivers WHERE drives.driver = drivers.id 
       AND drives.timestamp > DATE_SUB(now(), INTERVAL 12 MONTH)) data 
ON Months.Month = data.Month 
ORDER BY data.timestamp 

어떤 개월이 데이터 열에서 NULL 하나 개의 행이됩니다.