如何将PHP循环转换为MySQL查询?

时间:2014-06-05 08:17:04

标签: php mysql

我想在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的解决方案,但由于这会消除特定日期或参数,我无法让它工作。

1 个答案:

答案 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年时,您不必更新代码;)