MySqlクエリ時の日付補完(連続)の方法

6875 ワード

MySqlクエリ時の日付補完(連続)の方法
ある日、注文表の7日前の毎日の注文数を調べる必要があります.sqlは順番に書きます.
SELECT
    DATE_FORMAT(order_time,'%Y-%m-%d') date,
    count(*) orderCount
FROM
    order
WHERE
    date_sub(curdate(), INTERVAL 7 DAY) < date(order_time)
GROUP BY DATE_FORMAT(order_time,'%Y-%m-%d')
ORDER BY date ASC

実行すると、データが出てきましたが、連続していません.数量も7本もありません.ボスの商売は惨憺たるもので、一日に1つの注文ができないことが多いですが、プログラムにはデータがありません.だから、ここの直観的な方法は悪いデータを補うことです.どうやって補うのですか.最初に思いついたのはjavaのような上位言語で補うことです.
//                      
List<Map<String, Object>> orders= orderDao.queryOrder(7);
//            ,    0
List<String> dayList = DateUtil.dayList(7, 1,false);//  7          
boolean exists=false;
for (int i=0;i<dayList.size();i++) {
    exists=false;
    for (Map<String, Object> hs : orders) {
        if (dayList.get(i).equals(hs.get("date"))) {
            exists=true;
            break;
        }
    }
    if(!exists){
        final String date=dayList.get(i);
        orders.add(i,new HashMap<String,Object>(){{
            put("orderCount", 0);
            put("datat", date);
        }});
    }
}
return orders;

OK、大丈夫です.振り向くと、社長は7日間の業績は私の店が半年も開店しないで半年食べる本質を見ることができないと言って、カスタマイズして終了時間を調べて、私は言って、いいですよ.しかし、上記の方法は問題があります.本当に2年の日付を選んで調べなければなりません.それは何回循環しなければなりませんか.そこで頭を働かせて、ここからヒントを得ます:mysqlは日付グループ(group by)で統計を検索する時、データが0を補う解決方法がなくて、以下はsqlを書きます:
SELECT
    od.date,
    od.orderCount
FROM
    (
        SELECT
            DATE_FORMAT(order_time,'%Y-%m-%d') date,
            count(*) orderCount
        FROM
            order
        WHERE
            order_time>'    ' and order_time<'    '
        GROUP BY DATE_FORMAT(order_time,'%Y-%m-%d')

        UNION (SELECT 0, '2017-03-01')
        UNION (SELECT 0, '2017-03-02')
        UNION (SELECT 0, '2017-03-03')
        UNION (SELECT 0, '2017-03-04')
        UNION (SELECT 0, '2017-03-05')
        UNION (SELECT 0, '2017-03-06')
        UNION (SELECT 0, '2017-03-07')
        UNION (SELECT 0, '2017-03-08')
        --    UNION ......
    ) AS od
GROUP BY od.date
ORDER BY od.date ASC

もういい!sqlの中の長いUNION文については、選択した日付に基づいてjavaで生成しましょう.もっといい方法があると思います.教えてください.