需求: 查詢當前月每天的數據量,此處表的名稱為:ticket_ticket
直接上sql:
SELECT COUNT(*) as num, DATE(create_at) as t
FROM ticket_ticket
AND YEAR(create_at)=YEAR(CURDATE())
AND MONTH(create_at)=MONTH(CURDATE())
GROUP BY DATE(create_at)
查詢結果如下:
可以看出時間不連貫,沒有2021-01-03的數據。如果沒有特殊要求這樣的數據沒有問題,但我這邊是用來畫折線圖的,所以必須是連貫性的數據。
解決方法如下:
步驟一:生成一個日期表
sql如下:
SELECT
@cdate := date_add( @cdate, INTERVAL - 1 DAY ) as date
FROM
( SELECT @cdate := date_add(CURDATE(), INTERVAL + 1 DAY )
FROM ticket_ticket
)d1
WHERE YEAR(@cdate)=YEAR(CURDATE())
AND MONTH(@cdate)=MONTH(CURDATE())
AND DAY(@cdate) > 1
ORDER BY date
結果如下:
步驟二:將查詢結果表並入日期表
sql如下:
SELECT * FROM (
SELECT
@cdate := date_add( @cdate, INTERVAL - 1 DAY ) as date
FROM
( SELECT @cdate := date_add(CURDATE(), INTERVAL + 1 DAY )
FROM ticket_ticket
)d1
WHERE YEAR(@cdate)=YEAR(CURDATE())
AND MONTH(@cdate)=MONTH(CURDATE())
AND DAY(@cdate) > 1
ORDER BY date
)date_c LEFT JOIN (
SELECT COUNT(*) as num, DATE(create_at) as t
FROM ticket_ticket WHERE flow_id=336 AND YEAR(create_at)=YEAR(CURDATE()) AND MONTH(create_at)=MONTH(CURDATE()) GROUP BY DATE(create_at)
)tab ON DATE(t)=date
結果如下:
步驟三:處理查詢結果:NULL設置為0,並按照日期排序
sql如下:
SELECT date as 日期, IFNULL(tab.num, 0) as 數量 FROM (
SELECT
@cdate := date_add( @cdate, INTERVAL - 1 DAY ) as date
FROM
( SELECT @cdate := date_add(CURDATE(), INTERVAL + 1 DAY )
FROM ticket_ticket
)d1
WHERE YEAR(@cdate)=YEAR(CURDATE())
AND MONTH(@cdate)=MONTH(CURDATE())
AND DAY(@cdate) > 1
ORDER BY date
)date_c LEFT JOIN (
SELECT COUNT(*) as num, DATE(create_at) as t
FROM ticket_ticket WHERE flow_id=336 AND YEAR(create_at)=YEAR(CURDATE()) AND MONTH(create_at)=MONTH(CURDATE()) GROUP BY DATE(create_at)
)tab ON DATE(t)=date
ORDER BY date;
結果如下:
總結這里用到的sql
- ORDER BY
定義:用於對結果集按照一個列或者多個列進行排序。默認按照升序,如果需要按照降序對記錄進行排序,您可以使用 DESC 關鍵字
用法:
SELECT column_name
FROM table_name
ORDER BY column_name ASC|DESC;
-
DATE_ADD(date,INTERVAL expr type)
定義:向指定日期添加指定的時間間隔
用法:date 參數是合法的日期表達式。expr 參數是您希望添加的時間間隔,可以為正數+3,也可以為負數-3。type是間隔的類型,可以是天DAY,也可以是MONTH,也可以是其他的。 -
DATE(date)
定義: 提取日期或日期/時間表達式的日期部分
用法:date參數可以為日期‘2020-02-19’,也可以為時間‘2020-02-19 12:20:12’,最終結果都為‘2020-02-19’ -
LEFT JOIN
定義:從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結果為 NULL。
用法:
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
其中ON為合並條件,如果想直接合並,可以使用ON 1
- IFNULL(expr1,expr2)
定義:如果expr1字段為NULL,則返回值expr2