[MySQL] 統計圖數據查詢 (MySQL查詢時間範圍內所有日期)

1. 需求


任何管理系統都有統計圖, 像這樣的:

在這裏插入圖片描述

  • 這裏需要數據:
  1. 橫座標名
  2. 縱座標數值

案例


需求: 需要統計近七天的註冊用戶數量

前端需要的數據格式:

[
	{
	"日期":"2019-10-10",
	"註冊人數":1
	},
	{
	"日期":"2019-10-11",
	"註冊人數":1
	},
	{
	"日期":"2019-10-12",
	"註冊人數":1
	}
	...
]

有人可能會說, GROUP BY不就完了?

使用GROUP BY, 沒有數據的日期是不會查出來的.

思路


  1. 拿到時間範圍內所有日期
  2. 數據表進行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 BYCOUNT的相關教程.

願大家永無BUG!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章