我正在尝试使用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 ......我得到了这个该死的图表。 ;)
答案 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
这将每个时间戳都缩短到分钟的开头。