【问题标题】:mysql query for grabbing multiple date ranges用于获取多个日期范围的 mysql 查询
【发布时间】:2016-03-01 04:06:07
【问题描述】:

我似乎在提出查询以实现我想要的结果时遇到了一些麻烦。我有一张如下表..

| Date(TIMESTAMP)     | Count |
|---------------------|-------|
| 2016-02-01 01:00:00 | 52    |
| 2016-01-05 11:30:00 | 14    |
| 2016-02-01 04:20:00 | 36    |
| ...                 | ...   |

该表有大约 40,000 行。我想做的是获取多个日期范围的总数,所以我最终得到以下...

| Period     | Total |
|------------|-------|
| All        | 10245 |
| Past year  | 1401  |
| Past month | 104   |
| Past week  | 26    |

目前,我在我的 PHP 脚本中运行一个循环,并对我正在寻找的每个日期范围进行单独的查询。实际上,每个循环我正在执行大约 10 个查询来获取不同的统计信息,但对于示例,我正在简化它。这需要很长时间,我希望有一种更优雅的方式来做到这一点,但是我现在花了很多时间尝试不同的事情和研究,但一无所获。我了解如何使用 CASE 进行分组,但当一条记录可能需要放在多个 bin 中时,我不知道。有什么帮助吗?

【问题讨论】:

    标签: mysql group-by


    【解决方案1】:

    试试这个UNION 查询:

    SELECT 'All', COUNT(*) AS Total FROM yourTable
    UNION
    SELECT 'Past year', COUNT(*) AS Total
    FROM yourTable
    WHERE DATE(TIMESTAMP) > DATE_ADD(NOW(), INTERVAL -1 YEAR)
    UNION
    SELECT 'Past month', COUNT(*) AS Total
    FROM yourTable
    WHERE DATE(TIMESTAMP) > DATE_ADD(NOW(), INTERVAL -1 MONTH)
    UNION
    SELECT 'Past week', COUNT(*) AS Total
    FROM yourTable
    WHERE DATE(TIMESTAMP) > DATE_ADD(NOW(), INTERVAL -1 WEEK)
    

    【讨论】:

      【解决方案2】:

      第一。了解获取一年中的第一个日期、一个月的第一个日期和一周的第一个日期的功能。 然后使用计数和过滤器组成您的 sql,并使用不同时期的第一个和最后一个日期。

      参考:

      MySQL Select First Day of Year and Month

      https://stackoverflow.com/a/19259159/1258492

      https://stackoverflow.com/a/11831133/1258492

      select 'All' as period, count(1) from 
      tbl
      union
      
      select 'Past Year' as period, count(1) from 
      tbl
      where timestamp between 
      MAKEDATE(year(now())-1,1) and
      last_day(MAKEDATE(year(now())-1,1) + interval 11 month)
      
      union 
      
      select 'Past Month' as period, count(1) from 
      tbl
      where timestamp between 
      LAST_DAY(NOW() - INTERVAL 2 MONTH) + INTERVAL 1 DAY and
      LAST_DAY(NOW() - INTERVAL 1 MONTH)
      
      union 
      select 'Past Week' as period, count(1) from 
      tbl 
      where timestamp between 
      adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate())-7 DAY)  and
      adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate())-7 DAY) ;

      【讨论】:

        【解决方案3】:

        您可以使用子查询。每个时间细分使用一个子查询,如下所示:

        SELECT everything, 'past year'
        FROM 
            (
             SELECT sum(c) AS 'everything' 
             FROM reports
            ) t1,
            (
            SELECT sum(c) AS 'past year'  
            FROM reports
            WHERE d  >= DATE_ADD(CURDATE(), INTERVAL -1 YEAR)
            ) t2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-10
          • 2014-01-07
          • 2011-01-01
          • 2017-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多