按SQL中的DATE_FORMAT分组和Unix时间戳的返回组

时间:2014-01-18 00:48:44

标签: php mysql unix highcharts timestamp

我正在尝试使用Highcharts框架绘制从MySQL返回的数据集。以下是查询和格式化功能:

    function correlate_created_at_with_msg_vol($q, $time = NULL) {
      global $db; 
      date_default_timezone_set('America/Chicago');

      $q = mysqli_real_escape_string($db, $q);

      $query = "SELECT unix_timestamp(created_at) AS date,";
      $query .= " COUNT(tweet_id) AS count FROM `tweets`";
      $query .= " WHERE tweet_text LIKE '%{$q}%'" ;
      $query .= " GROUP BY created_at";
      $query .= " LIMIT 20";
      $tweets = mysqli_query($db, $query);
      confirm_query($tweets);
      return $tweets;
    }

    function format_data($q) {
      $msg_vol = correlate_created_at_with_msg_vol($q);

      while ($tweet = mysqli_fetch_array($msg_vol, MYSQL_ASSOC)) {
        # had ot modify correlate_created_at_with_msg_vol()
        # to no longer use unix timestamps
        $date = $tweet['date'] * 1000;
        $count = intval($tweet['count']);
        $formatted[] = array($date, $count);
      }
      return $formatted;
    }

将$ date乘以1000(根据Highchart的文档)将unix时间戳更改为自EPOCH以来的毫秒数。但是,这违反了我的GROUP BY created_at部分查询,因为它们不再按时分组。如何调整查询,以便在unix时间戳中仍然对分钟间隔内发生的所有记录进行分组?

我应该在使用strtotime进行SQL查询后进行转换吗?我还在学习,但我猜这将成为解决方案;不幸的是,根据我的理解,在数据库端执行该过程对性能更好。如果我错了,请随意纠正我。

我宁愿让DB执行DATE_FORMAT(created_at,'%Y-%m-%d%l:%i%p')并返回该行,但由于我需要一个unix时间戳,我可以找不到办法做到这一点。

我对所有建议/反馈/想法/批评持开放态度。谢谢。

P.S。 我打算放弃mysqli支持PDO ......我得到了这个该死的图表。 ;)

1 个答案:

答案 0 :(得分:1)

试试这个:

SELECT floor(unix_timestamp(created_at)/60)*60 AS date,
       COUNT(tweet_id) AS count 
FROM `tweets`
WHERE tweet_text LIKE '%{$q}%'
GROUP BY date

这将每个时间戳都缩短到分钟的开头。