我正在做一些报告,认为我需要使用临时表。我的代码执行一个api调用,以获取当天与该系统交互的所有用户cookie。
现在,我有了一个包含所有cookie和它们使用的浏览器类型的表,我可以循环遍历api提供的cookie数组,并对每个diff浏览器进行sql查找,以便最终报告不同浏览器进行的浏览器访问次数。
但是,正如您可以想象的那样,如果有很多cookie(确实有),这可能会花费很长时间。
据我所知,解决方案是将传递给我的cookie创建一个临时表,并将其内部连接到我的cookie数据表中,然后执行
select count(id),broswer ... group by browser下面是我想要尝试的更多的代码视图:
$json = file_get_content($apiURL);
$cookies = '';
foreach($json as $val){$cookies .= ','.$val['cookie']; }
$cookies = substr($cookies,1);
mysql_query('CREATE TEMPORARY TABLE passedcookies (
`cookie` varchar(200) NOT NULL,
PRIMARY KEY(cookie)
) values ($cookies);')
mysql_query('SELECT count(cd.id), cd.browser FROM cookiedata cd
INNER JOIN passedcookies pc
ON pc.cookie = cd.cookie
GROUP BY cd.browser;');
mysql_query('DESTROY TEMP TBL;');我一定要毁掉临时桌子吗?什么时候被毁了?如果有3个用户运行该报告,那么每个用户都会得到自己的临时表吗?
谢谢你的帮助
发布于 2013-08-28 19:50:01
如果您愿意,可以销毁临时表。如果没有,它将在MySQL连接关闭时自动销毁。除非您使用共享连接,否则当PHP脚本退出时,就会发生这种情况。
如果您没有使用共享连接,那么每个用户都会得到他们自己的临时表。
创建临时表的SQL语法是错误的,但您并没有问到这一点。在VALUES中没有CREATE TEMPORARY TABLE子句,它属于您在它之后使用的INSERT语句中。
实际上,我不认为你需要临时的桌子。查询:
SELECT browser, count(*)
FROM cookiedata
WHERE cookie in ($cookies)
GROUP BY browser应该能正常工作。我认为MySQL很好地实现了IN (list)。
https://stackoverflow.com/questions/18496815
复制相似问题