mysql groupby 日期_sql 语言 groupBy 分组统计时间段解决方案
記錄一下數據統計時遇到的問題和解決方案
先貼完整的效果
問題一 GroupBy數據不是每天連續的
統計圖是關于某段時間內,每年/每月/每周的微博數量的折線圖。數據為連續不斷的,但現實的情況中數據庫里的數據不可能是連續的,情況如下
數據中4號 ~ 7號的時間段沒有返回,我們理想中的返回格式是補全沒有的日期,然后在這個日期對應的數量字段填0。
在網上google了一下,解決方案是新建一張自期表做主表,左聯要統計的表,
CREATE TABLE num (i int);-- 創建一個表用來儲存0-9的數字
INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);-- 生成0-9的數字,方便以后計算時間
CREATE TABLE if not exists calendar(datelist date); -- 生成一個存儲日期的表,datalist是字段名
-- 這里是生成并插入日期數據
INSERT INTO calendar(datelist) SELECT
adddate(
( -- 這里的起始日期,你可以換成當前日期
DATE_FORMAT("2016-1-1", '%Y-%m-%d')
),
numlist.id
) AS `date`
FROM
(
SELECT
n1.i + n10.i * 10 + n100.i * 100 + n1000.i * 1000+ n10000.i * 10000 AS id
FROM
num n1
CROSS JOIN num AS n10
CROSS JOIN num AS n100
CROSS JOIN num AS n1000
CROSS JOIN num AS n10000
) AS numlist;
運行sql語句后,請刪除num表
這個時間我們拿到了日期表,用日期表做主表,左聯一下就能解決問題一
問題二 使用了left join,where是針對左表,但左表是日期表,那如何做業務表上的條件限制
原因分析:
數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然后再將這張臨時表返回給用戶;
where條件是在臨時表生成好后,再對臨時表進行過濾的條件;
因此:where 條件加上,已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。
解決方案是把限制條件放在on后面
select a.*,b.*
from table1 a
left join table2 b on b.X=a.X and XXX
結論:
where后面:是先連接然生成臨時查詢結果,然后再篩選
on后面:先根據條件過濾篩選,再連 生成臨時查詢結果
結語
水平有限,關于補0的那個問題其實還想到查詢出來用php循環補全日期和補0,但是業務上有很多處要用到這個,用php的話代碼量很多,所以了新建日期表這個方案,如果有好的方案希望大家貼上來,多多交流。
本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
未經允許禁止轉載 -- 苦力小林,
總結
以上是生活随笔為你收集整理的mysql groupby 日期_sql 语言 groupBy 分组统计时间段解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql查询cpu使用率100%_数据
- 下一篇: html获取text值_Python小程