Php 查询失败了,我被困在树林里
我正在尝试执行一个查询,从images表中删除filters表中不存在的所有文件。我跳过了数据库中3500个最新的文件,以便将表重新调整为3500+X filters表中的记录量 过滤器表包含文件的标记以及图像表中使用的文件id 代码将在cron作业上运行 我的代码:Php 查询失败了,我被困在树林里,php,mysql,Php,Mysql,我正在尝试执行一个查询,从images表中删除filters表中不存在的所有文件。我跳过了数据库中3500个最新的文件,以便将表重新调整为3500+X filters表中的记录量 过滤器表包含文件的标记以及图像表中使用的文件id 代码将在cron作业上运行 我的代码: $sql = mysql_query("SELECT * FROM `images` ORDER BY `id` DESC") or die(mysql_error()); while($row = mysql_fetch_ar
$sql = mysql_query("SELECT * FROM `images` ORDER BY `id` DESC") or die(mysql_error());
while($row = mysql_fetch_array($sql)){
$id = $row['id'];
$file = $row['url'];
$getId = mysql_query("SELECT `id` FROM `filter` WHERE `img_id` = '".$id."'") or die(mysql_error());
if(mysql_num_rows($getId) == 0){
$IdQue[] = $id;
$FileQue[] = $file;
}
}
for($i=3500; $i<$x; $i++){
mysql_query("DELETE FROM `images` WHERE id='".$IdQue[$i]."' LIMIT 1") or die("line 18".mysql_error());
unlink($FileQue[$i]) or die("file Not deleted");
}
echo ($i-3500)." files deleted.";
筛选器表中包含图像表id的行数:63
php脚本执行时间:4秒+/-0.5秒
相关数据库结构
表:图像
身份证件
网址
等等
表:过滤器
身份证件
img_id包含来自images表的id
等
如果$x<3500,则此操作不起任何作用。你可能想要:
for($i=3500; $i<($x + 3500); $i++){
重新阅读有关SQL JOIN的文档也是一个好主意。根据Brendan的答案,您可以构建一个SQL JOIN。您的整个脚本可能看起来就像:
$query = mysql_query(
"DELETE FROM `images` WHERE `id` NOT IN (
SELECT `id` from `filter`
) ORDER BY `id` DESC LIMIT 3500,12340283492834
") or die(mysql_error());
printf("Files deleted: %d\n", mysql_affected_rows());
子查询SELECT`id`from`filter`LIMIT 350012340283492834首先解析,并将id列表返回给父查询以在WHERE子句中使用。然后通过传入偏移量保留最后3500行,这样它将跳过前3500行,然后删除其余的行。请注意丑陋的限制350012340283492834。。。这是因为MySQL不支持无限制的偏移
完成后,运行select查询以获取所有图像URL,然后循环文件系统上的图像,如果文件名不在结果数组中,则将其删除。请编辑问题标题并将其改为有意义的内容。因为标签信息不属于标题,所以至少要删除php和mysql,这会导致查询崩溃…,这绝对没有意义。使用清晰的标题有助于吸引那些可能会给你答案的人。谢谢。for循环中的$x变量来自哪里?它来自计数器。。。。那已经不存在了。。。lolIt应该仍然工作,即使循环从未终止。。。显然,编辑是必要的。我认为循环从一开始就不会开始,也许这就是它不删除任何文件的原因。不幸的是,限制3500不是我们想要的,因为我们想要的结果是留下3500+个过滤器。我正在考虑如何做,但我很累:\n这将从数据库中删除行,但不会删除磁盘上的文件。请注意取消链接的调用@TurboJ.假设有10000条记录,我限制3500条,那么我还有6500条记录,对吗?我需要做的是保留3500个最高的自动递增id,并删除其余的。因此限制会有所不同。@user1290323您也可以使用基本相同的查询来获取要删除的文件列表,并从中选择“url”。。。而不是从…中删除。。。。不过你需要使用一个事务。那个取消链接的电话怎么样?我在想。。。读取目录中的文件名并与数据库中的url字段进行比较,然后相应地取消链接。。。有没有更好的建议,因为这似乎效率低下
for($i=3500; $i<($x + 3500); $i++){
$query = mysql_query(
"DELETE FROM `images` WHERE `id` NOT IN (
SELECT `id` from `filter`
) ORDER BY `id` DESC LIMIT 3500,12340283492834
") or die(mysql_error());
printf("Files deleted: %d\n", mysql_affected_rows());