Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将PHP循环转换为MySQL查询?_Php_Mysql - Fatal编程技术网

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

如何将PHP循环转换为MySQL查询?,php,mysql,Php,Mysql,我正试图让一个PHP循环在MySQL中为我工作。目前,通过特定URL参数访问网站的所有内容都会与访问日期和时间一起登录到表中。我正在重建日志记录过程,以便在一天内仅通过一个特定参数计算访问次数,但我必须首先转换旧数据 下面是我要做的:MySQL表(我们称之为myu-visions)有3列:parameter、visit\u-id和time。 在我的PHP代码中,我创建了以下循环来收集我需要的数据(对于所有参数,一天内通过一个参数进行的所有访问): foreach(范围(2008年、2014年)为

我正试图让一个PHP循环在MySQL中为我工作。目前,通过特定URL参数访问网站的所有内容都会与访问日期和时间一起登录到表中。我正在重建日志记录过程,以便在一天内仅通过一个特定参数计算访问次数,但我必须首先转换旧数据

下面是我要做的:MySQL表(我们称之为
myu-visions
)有3列:
parameter
visit\u-id
time
。 在我的PHP代码中,我创建了以下循环来收集我需要的数据(对于所有参数,一天内通过一个参数进行的所有访问):

foreach(范围(2008年、2014年)为$year){
$VISIST_data=array();
$date_ts=标准时间($year.-01-01');
while($date\ts prepare($sql);
$stmt->execute(数组($date));
而($row=$stmt->fetch()){
$VISIST_data[]=数组(
'param'=>$row['parameter'],
“访问次数”=>$row[“总计”],
“日期”=>$date);
}
$stmt->closeCursor();
}
}
稍后,使用多个
INSERT
(多亏了SO!:)将收集的数据插入到一个新表中(基本上消除了
visit\u id

上面的代码可以工作,但由于表的大小(大约340万行),速度非常慢。仅使用7*365 SQL查询来收集数据对我来说似乎是错误的,我担心仅运行脚本的影响会大大降低速度


有没有一种方法可以让这个循环在MySQL中工作,比如一个等价的查询或其他什么(可能每年一次)?我已经尝试了使用GROUP BY的解决方案,但由于这消除了特定日期或参数,因此我无法使其工作。

您可以
GROUP
进一步

SELECT `parameter`, COUNT(`parameter`) AS `total`, DATE(`time`) AS `date`
FROM `my_visits`
GROUP BY `parameter`, DATE(`time`)
然后可以执行一次(而不是在循环中),并使用
$row['date']
而不是
$date


这也意味着,到2015年时,您无需更新代码;)

什么是
$datum
?查询中没有占位符。你为什么不在
$date
中使用占位符呢?@Barmar很抱歉,当我试图清理我的代码时,这种情况总是发生在我身上。我经常忽略一两个事件。占位符的确切含义是什么?占位符是
:在PDO查询中输入的、被
执行
调用中的参数替换的名称。它应该是
在CONCAT(?“00:00”)和CONCAT(?“23:59”)之间的时间
仅仅为了我对上下文的理解(我认为Niet已经给出了最好的具体答案):只运行一次这个脚本,将结果插入一个新的、小得多的表中,并将日期和参数作为主键(或索引列),然后在具体用例中使用压缩表?这样,您只需要每天用最新数据更新一次压缩表
SELECT `parameter`, COUNT(`parameter`) AS `total`, DATE(`time`) AS `date`
FROM `my_visits`
GROUP BY `parameter`, DATE(`time`)