2012-08-24 284 views
0

我有一個表,看起來像這樣:的總和和分組按日期

ID t_stamp   views uviews hits uhits 
1 7/18/2012 19:00 105 11  0 0 
5 7/18/2012 20:00 1  1  0 0 
2 7/19/2012 9:00 118 4  0 0 
1 7/19/2012 10:00 196 18  0 0 
7 7/19/2012 11:00 2  1  0 0 
2 7/19/2012 12:00 38 11  0 0 
2 7/19/2012 13:00 20 5  0 0 
2 7/19/2012 19:00 9  2  0 0 
2 7/20/2012 15:00 85 6  0 0 
1 7/20/2012 16:00 483 101 2 2 
2 7/20/2012 17:00 1200 240 0 0 
2 7/20/2012 18:00 1200 232 0 0 
2 7/20/2012 19:00 1199 231 0 0 
2 7/20/2012 20:00 1200 236 0 0 
2 7/20/2012 21:00 1201 237 0 0 
1 7/20/2012 22:00 1220 187 0 0 
1 7/20/2012 23:00 869 165 0 0 

而且我的方法是按天把它們結合在一起,所以我可以得到一個SUM每個最後四列。這些ID並不重要。

我使用這個:

SELECT `bannerID` , DATE_FORMAT(`t_stamp` , '%m/%d/%Y') AS `date` , 
SUM(`views`) AS `views` , SUM(`uviews`) AS `uviews` , SUM(`hits`) AS `hits` , SUM(`uhits`) AS `uhits` 
FROM test_bannerstats 
WHERE DATE(t_stamp) >= DATE('2012-07-01') 
AND DATE(t_stamp) <= DATE('2012-08-24') 
GROUP BY `date` 
ORDER BY `date` ASC 

但是這似乎不正確的我,它的數字似乎相互矛盾。最後,我希望每天得到最後四列的日常記錄。

編輯:

這是一個時區看起來有問題!我會告訴你爲什麼...

看看上面的表,現在讓我們做加法整個一天......

1 07/18/2012 106  12 0  0 
1 07/19/2012 383  41 0  0 
1 07/20/2012 8657 1635 2  2 

以上是正確的。下面是錯誤的。

1 07/18/2012 105  11 0  0 
1 07/19/2012 384  42 0  0 
1 07/20/2012 4167 810 2  2 

問題?晚上8點以後的任何事情都會在第二天進行。這是一個時區問題,我必須理清它。

+0

查詢結果給出的結果是什麼?通過簡單地閱讀它,它看起來是正確的。 –

回答

0

您的查詢可以簡化爲:

SELECT `bannerID`, 
     DATE_FORMAT(`t_stamp` , '%m/%d/%Y') AS `date`, 
     SUM(`views`) AS `views`, 
     SUM(`uviews`) AS `uviews`, 
     SUM(`hits`) AS `hits`, 
     SUM(`uhits`) AS `uhits` 
FROM test_bannerstats 
WHERE DATE(t_stamp) BETWEEN '2012-07-01' AND '2012-08-24' 
GROUP BY DATE(t_stamp) 
ORDER BY DATE(t_stamp) ASC; 
+0

不錯的簡化! :) – Kilokahn

0

試試這個,

SELECT DATE_FORMAT(DATE(t_stamp), '%m/%d/%Y') AS `date`, 
     SUM(views) totalViews, 
     SUM(uviews) totalUViews, 
     SUM(hits) totalHits, 
     SUM(uhits) totalUHits, 
FROM tableName 
WHERE DATE(t_stamp) >= DATE('2012-07-01') AND 
      DATE(t_stamp) <= DATE('2012-08-24') 
GROUP BY DATE(t_stamp) 
ORDER BY `date` ASC 
0
  • 如果你想給你的指數有機會使用,避免使用列功能當你可以。更換條件:

    WHERE DATE(t_stamp) >= DATE('2012-07-01') 
        AND DATE(t_stamp) <= DATE('2012-08-24')` 
    

    有:

    WHERE t_stamp >= DATE('2012-07-01') 
        AND t_stamp < DATE('2012-08-25') 
    
  • 你定義在SELECT列表中的別名date。該別名不能用在WHEREGROUP BY子句中(說實話,它可以在GROUP BY子句中使用,但我不會推薦它)。相反的:

    GROUP BY `date` 
    

    使用:

    GROUP BY DATE(t_stamp) 
    
  • 有可用的專有MySQL的語法(你可以在SELECT documenation閱讀)當GROUP BYORDER BY在相同的表達來完成。相反的:

    GROUP BY DATE(t_stamp) 
    ORDER BY DATE(t_stamp) ASC; 
    

    你可以使用(對於微弱的效率增益):

    GROUP BY DATE(t_stamp) ASC ; 
    

現在的查詢變爲:

SELECT 
    bannerID 
    , DATE_FORMAT(DATE(t_stamp), '%m/%d/%Y') AS `date` 
    , SUM(views) AS views 
    , SUM(uviews) AS uviews 
    , SUM(hits) AS hits 
    , SUM(uhits) AS uhits 
FROM 
    test_bannerstats 
WHERE 
    t_stamp >= DATE('2012-07-01') 
    AND 
    t_stamp < DATE('2012-08-25')  --- notice the `<` and the +1 date offset 
GROUP BY 
    DATE(t_stamp) ASC ; 
+0

我想你的意思是'ORDER BY DATE(t_stamp)ASC':D –

+0

@John:不,我的意思是我寫的。 –

0

我覺得你的SQL查詢不會真正起作用,那隻適用於7月1日至8月24日。如果最後4日期超過該日期,該怎麼辦?它不會拿起任何東西。

在我看來做到這一點的最好辦法是這樣的:

SELECT SUM(column_name) FROM table_name order by id DESC limit 4; 

排序按ID倒序將按降序排序結果。限4,只會拿起前4的結果。

希望有所幫助。