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

我的方法是按天将它们组合起来,这样我就可以获得最后四列中的每一列的总和。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 点之后的任何事情都将持续到第二天。这是一个我必须解决的时区问题。

4

4 回答 4

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
于 2012-08-24T06:58:31.160 回答
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;
于 2012-08-24T06:59:20.087 回答
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' )
    
  • date您在SELECT列表中定义别名。这个别名不能用在WHEREorGROUP BY子句中(老实说,它可以用在 GROUP BY 子句中,但我不推荐它)。代替:

    GROUP BY `date`
    

    采用:

    GROUP BY DATE(t_stamp)
    
  • SELECTGROUP BYandORDER BY在同一个表达式上完成时,有一个专有的 MySQL 语法可用(您可以在文档中阅读它)。代替:

    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 ;
于 2012-08-24T07:06:04.123 回答
0

我认为您的 sql 查询不会真正起作用,仅适用于 7 月 1 日至 8 月 24 日的日期。如果最后 4 个日期超出该日期怎么办?它不会捡起任何东西。

在我看来,最好的方法是:

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

Order by ID desc 将按降序对结果进行排序。限制 4,只会获取前 4 个结果。

希望有帮助。

于 2012-08-24T07:09:19.220 回答