簡體   English   中英

每天記錄計數,包括 0 個值

[英]Records count per day, including 0 values

我正在嘗試獲取一個查詢,該查詢將顯示過去 7 天每天的訪問次數。 我提出的查詢有效,但它有我不知道如何擺脫的限制。

想象一下,現在是 2019 年 8 月 4 日。我們的visits表保留了用戶訪問網站的時間戳:

ID | timestamp
1 | 2019-08-03
2 | 2019-08-03
3 | 2019-08-02
4 | 2019-07-31
5 | 2019-07-31
6 | 2019-07-31
7 | 2019-07-31
8 | 2019-07-30
9 | 2019-07-30
10 | 2019-07-28

目標:獲取過去 7 天內每天訪問網站的次數。 所以結果應該是這樣的:

DATE | NumberOfVisitis
2018-08-04 | 0
2018-08-03 | 2
2018-08-02 | 1
2018-08-01 | 0
2018-07-31 | 4
2018-07-30 | 1
2018-07-29 | 0

我的查詢僅包括在 DB 中注冊的日期(不包括沒有訪問的天數)。 這是有道理的,因為查詢依賴於數據,而不是日歷。

SELECT DATE_FORMAT(`timestamp`, "%Y%m/%d") AS Date, COUNT(`id`) AS
NumberOfVisitis FROM `visits` WHERE `timestamp` >= DATE_ADD(NOW(),
INTERVAL -7 DAY) GROUP BY DAY(`timestamp`) ORDER BY `timestamp` DESC

您能否讓我知道如何修改我的查詢以在查詢結果中包含沒有訪問的天數?

MySQL缺少像Postgres的generate_series這樣的東西,所以我們不得不假裝它。

最簡單的方法是制作一個包含大量數字的表格。 這對於生成很多東西很有用。

create table numbers ( number serial );
insert into numbers () values (), (), (), (), (), (), ();

由此我們可以生成過去7天的列表。

select date_sub(date(now()), interval number-1 day) as date
from numbers
order by number
limit 7

然后使用它作為CTE(或子查詢)我們left join它與訪問。 左連接表示將出現所有日期。

with dates as (
    select date_sub(date(now()), interval number-1 day) as date
    from numbers
    order by number
    limit 7
)
select date, coalesce(sum(id), 0)
from dates
left join visits on date = timestamp
group by date
order by date

@Schwern,最后我能夠根據你的提示找到解決方案。 由於CTE在我的服務器上不可用,我創建了一個視圖,結果如下: https//ibb.co/zxRcwN3

非常感謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM