Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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 查询失败了,我被困在树林里_Php_Mysql - Fatal编程技术网

Php 查询失败了,我被困在树林里

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

我正在尝试执行一个查询,从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_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());