我想在MySQL中为我做一个PHP循环。目前,通过特定URL参数对网站的所有访问都与访问的日期和时间一起登录到表中。我正在重建日志记录程序,仅在一天内通过一个特定参数计算访问次数,但我必须先转换旧数据。
以下是我尝试做的事情:MySQL表格(让我们称之为my_visits
)有3列:parameter
,{{1} }和visit_id
。
在我的PHP代码中,我创建了以下循环来收集我需要的数据(所有参数在一天内通过一个参数进行的所有访问):
time
稍后,使用多个foreach (range(2008, 2014) as $year) {
$visit_data = array();
$date_ts = strtotime($year . '-01-01');
while ($date_ts <= strtotime($year . '-12-31')) {
$date = date('Y-m-d', $date_ts);
$date_ts += 86400;
// count visit data
$sql = 'SELECT parameter, COUNT(parameter) AS total ' .
'FROM my_visits ' .
'WHERE time BETWEEN \''.$date.' 00:00\' AND \''.$date.' 23:59\' '.
'GROUP BY parameter ORDER BY total DESC';
$stmt = $db->prepare($sql);
$stmt->execute(array($date));
while ($row = $stmt->fetch()) {
$visit_data[] = array(
'param' => $row['parameter'],
'visit_count' => $row['total'],
'date' => $date);
}
$stmt->closeCursor();
}
}
将收集的数据插入到新表中(基本上消除了visit_id
)(感谢SO!:)。)
上面的代码有效,但是由于表的大小(大约340万行),它非常慢。使用7 * 365 SQL查询只是为了收集数据似乎对我来说是错误的,我担心只是运行脚本的影响会大大减慢一切。
有没有办法让这个循环在MySQL中工作,就像一个等价的查询或某事(或许每年)?我已经尝试过使用GROUP BY的解决方案,但由于这会消除特定日期或参数,我无法让它工作。
答案 0 :(得分:3)
您可以GROUP
进一步。
SELECT `parameter`, COUNT(`parameter`) AS `total`, DATE(`time`) AS `date`
FROM `my_visits`
GROUP BY `parameter`, DATE(`time`)
然后,您可以执行一次(而不是循环播放)并使用$row['date']
代替$date
。
这也意味着,当我们到达2015年时,您不必更新代码;)