2013-05-14 111 views
0

我想根據日期範圍內的每日級別計算所有點擊次數。使用SQL(PHP)計算日期範圍內的點擊次數

比方說,我想「2013年5月1日」之間計數的所有點擊 - 「2013年5月30日」,並希望下面的結果是這樣的:

date   clicks 
2013-05-01  50 
2013-05-02  60 
2013-05-03  65 
2013-05-04  0 
etc... 

目前我「已經下面的SQL調用

SELECT count(date) as clicks, date FROM views WHERE uid = $id group by date ORDER BY date DESC 

這工作正常,唯一的問題是,我不明白日期範圍內所有的日子,但只有天那裏是點擊。我應該能夠獲得所有的日子,也就是有0次點擊的日子。

希望有人能幫助

+0

你的意思是你只在日期列的日期?或者你沒有得到2012-05-04 0點擊這真的很奇怪? – 2013-05-14 09:47:53

+3

你的數據庫如何返回你甚至沒有的數據。如果有些日子沒有顯示,這意味着他們沒有數據,你可以很容易地將它添加到你的PHP代碼,以0計數顯示這些日期 – 2013-05-14 09:48:10

+1

可能重複[MySQL如何填補範圍內的缺失日期?](http ://stackoverflow.com/questions/3538858/mysql-how-to-fill-missing-dates-in-range) – 2013-05-14 09:58:59

回答

3

由於您只從有點擊次數的日子獲得結果,因此您不會在沒有點擊的情況下獲得任何結果。您需要

A)生成日期列表並返回每天的點擊次數。 類似於SQL Server: How to select all days in a date range even if no data exists for some days

B)除了使用所得的行的輸出的,枚舉的每一天在PHP和插入一個0進入輸出如果一天未在SQL結果集中找到。您可以使用date_add每週添加一天到期間開始DateTime,並將其格式化爲與date一致的字符串,以根據結果的日期進行檢查。

0

嘗試使用BETWEEN條款等

SELECT * FROM table_name WHERE column_name BETWEEN start_date AND end_date 
+0

對-1有何評論?我想讓你糾正我 – 2013-05-14 09:48:14

+0

這很好,但我認爲他想要所有日期的結果,而不僅僅是他在db中的結果。我沒有給你-1順便說一句。 – 2013-05-14 09:50:40

+1

不起作用。它應該返回日期範圍內的所有日期並計算當天的點擊次數。這個例子只返回有任何點擊的日子:-) – 2013-05-14 09:52:14

0

嘗試這樣的,因爲現在你是在日期範圍內獲得的值。

SELECT count(date) as clicks, date FROM views 
WHERE uid = $id AND date BETWEEN $from_dt AND $to_dt 
group by date ORDER BY date DESC; 

此外,只有當您的表在特定日期有任何記錄時,此查詢纔會返回計數。

+0

不起作用。它應該返回日期範圍內的所有日期並計算當天的點擊次數。這個例子只返回有任何點擊的日子:-) – 2013-05-14 09:53:59

+0

@SimonThomsen不僅如此。不管你寫的是什麼查詢,它只有在表有數據時纔會返回。在這種情況下,您需要分別生成所有日期,然後您應該獲得日期的計數。 – 2013-05-14 09:56:01

0
SELECT count(date) as clicks, date 
FROM views 
WHERE uid = $id 
    AND date between 'date1' and 'date2' 
group by DAY(date) 
ORDER BY date DESC 
+0

不起作用。它應該返回日期範圍內的所有日期並計算當天的點擊次數。這個例子只返回有點擊的日子:-) – 2013-05-14 09:51:43

+0

nope,它會回退DB中的日期!你不能期望查詢是聰明的,併爲你休息日期。你必須先找到所有日期(在mysql中使用日期函數),然後檢查每一個日期。或者有人建議在PHP中設置0不存在於db中的日期。 – 2013-05-14 09:54:24

0

試試這個:

select sum(clicks) as total_clicks,date from views where uid='$id' AND (date BETWEEN $from_dt AND $to_dt) group by date order by date desc