2

こんにちは、この sql クエリを使用して、チャート表現の月に基づいて過去 12 か月のレコードを取得しています。

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

ただし、1 か月分のレコードがない場合、期待どおりに結果セットに含まれず、目的を達成するために php で多くの計算を行っています。

私の質問は次のとおりです。過去 12 か月間の各月のドライブの合計を含む単純な結果セットを取得する方法はありますか。また、1 か月間にドライブが 0 件の場合は、結果セットにも含める必要があります。

4

1 に答える 1

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は、データ列に が 1 行含まれます。

于 2013-11-03T20:14:09.780 に答える