1. 需求
任何管理系統都有統計圖, 像這樣的:
- 這裏需要數據:
- 橫座標名
- 縱座標數值
案例
需求: 需要統計近七天的註冊用戶數量
前端需要的數據格式:
[
{
"日期":"2019-10-10",
"註冊人數":1
},
{
"日期":"2019-10-11",
"註冊人數":1
},
{
"日期":"2019-10-12",
"註冊人數":1
}
...
]
有人可能會說,
GROUP BY
不就完了?
使用GROUP BY
, 沒有數據的日期是不會查出來的.
思路
- 拿到時間範圍內所有日期
- 數據表進行
GROUP BY
查詢,LEFT JOIN
日期表
吐槽一下…PgSql很容易就能拿到了, MySQL比較繁瑣…
解決方案
最終在Stack Overflow
上找到較優解法:
select a.Date
from (
select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) ) DAY as Date
from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
) a
where a.Date between '2010-01-20' and '2010-01-24'
這個方法不像網上某些坑, 此解決方案不使用循環,過程或臨時表. 也就是—效率高.
只要把這個表進行left join
你的數據表, 就可以很輕鬆拿到每天的數據量!
更優雅的寫法
封裝爲視圖:
CREATE VIEW v_digits AS
SELECT 0 AS digit UNION ALL
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7 UNION ALL
SELECT 8 UNION ALL
SELECT 9;
CREATE VIEW v_numbers AS
SELECT
ones.digit + tens.digit * 10 + hundreds.digit * 100 + thousands.digit * 1000 AS number
FROM
v_digits as ones,
v_digits as tens,
v_digits as hundreds,
v_digits as thousands;
CREATE VIEW v_dates AS
SELECT
SUBDATE(CURRENT_DATE(), number) AS date
FROM
v_numbers
UNION ALL
SELECT
ADDDATE(CURRENT_DATE(), number + 1) AS date
FROM
v_numbers;
查詢日期:
SELECT
date
FROM
dates
WHERE
date BETWEEN '2010-01-20' AND '2010-01-24'
ORDER BY
date
以上就是核心的統計圖數據查詢. 基礎紮實的同學看到這裏應該可以獨立解決了.
如果不懂, 請自行查找GROUP BY
、COUNT
的相關教程.