2011-05-17 21 views
2

比方說,你有一個簡單的表:如何從數據庫表格中創建30天的數據數組,其中某些日期未輸入?

ID IP     CREATED_DATE 
------------------------------------------------------- 
1 111.111.111.111  2011-03-28 14:12:31 
2 111.111.111.111  2011-03-29 03:38:12 
3 222.222.222.222  2011-04-02 12:04:45 
4 111.111.111.111  2011-04-02 22:13:23 
5 333.333.333.333  2011-04-03 05:53:15 
6 222.222.222.222  2011-04-05 02:13:51 
7 111.111.111.111  2011-04-07 11:45:34 

我需要查詢最近30天,並獲得獨特的IPS和每天的總行數即使有沒有那一天的條目。所以沒有輸入的日子顯然只是0,作爲唯一行和總行的數組值。

+0

大聲笑,我可以建立查詢...但我的腦袋現在炒。它讓我不知道如何在查詢中包含不存在的日子,無論是NULL還是0. – Tomas 2011-05-17 01:01:09

回答

3

如果你有一個integers表,可以生成所有天所需時間跨度並加入那些有吻合出現在你的餐桌IP地址每天的

SELECT timespan."day", 
      COALESCE(num_uniq_ips, 0) AS num_uniq_ips, 
      COALESCE(num_records, 0) AS num_records 
    FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL i DAY) AS "day" 
      FROM integers 
      WHERE i < 30) timespan 
LEFT JOIN (SELECT DATE(created_date) AS "day", 
        COUNT(DISTINCT ip) AS num_uniq_ips, 
        COUNT(1) AS num_records 
      FROM so6025149 
     GROUP BY 1) tallies 
      ON timespan."day" = tallies."day" 
ORDER BY timespan."day" ASC; 
+0

我不確定這是如何工作的。我從來沒有使用整數表。 – Tomas 2011-05-17 03:56:27

+1

@Tomas,它只是一個連續整數的表格(或視圖)。我在MySQL中使用0到999之間的數字,以便我可以生成任意範圍。 (其他RDBMS具有完成相同功能的功能)。如果我需要過去30天,如上所述,我可以使用表的記錄0 - 29來計算今天減去零天,今天減去一天,今天減去兩天...今天減去29天。當我想計算每一天的某些事情時,這給了我填補其他表中缺少的空白的範圍... – pilcrow 2011-05-17 04:03:35

+0

ahh,gotcha ...現在我確定瞭解這種方法。我現在要去試試看。 – Tomas 2011-05-17 04:19:12

-2
SELECT COUNT(DISTINCT column_name) 
FROM table_name 
WHERE (DateTime > (GetDate()-30)) 

東西沿着這些線路

+1

雖然這似乎並不能填補缺失的日期。 – Crashspeeder 2011-05-17 01:01:32

+0

這隻會得到不同的計數,並且不會包含不存在的日期。我幾乎是積極的,這不能在MySQL中完成,但我很想被證明是錯誤的! – Tomas 2011-05-17 01:03:06

+0

如果有人可以想出一個簡單而緊湊的PHP/MySQL組合,那麼我會和它一起查詢。 – Tomas 2011-05-17 01:04:34

0

您可以創建一個臨時表,在過去30天來填充它和使用,在您的查詢。從PHP代碼:

// create table with past 30 days 
$buffer = "CREATE TEMPORARY TABLE IF NOT EXIST past_month (val DATETIME NOT NULL);"; 
$now = new DateTime(now); 
for($i=30;$i>0;$i++) 
{ 
    $buffer += "INSERT INTO past_month VALUES(" . $now . ");"; 
    $now->sub(new DateInterval('P1D')); 
} 
mysql_query($buffer); 

// the query  
$sql= "SELECT 
      val, 
      (SELECT COUNT(IP) 
      FROM table 
      WHERE DATE_FORMAT(CREATED_DATE,'%Y-%m-%d) = DATE_FORMAT(val,'%Y-%m-%d') As    UNIQUE_IPS 
     FROM 
      past_month"; 
$result = mysql_query($sql); 
相關問題