2

基本的に、画像テーブルを 3,500 行の未保存または未フィルタリングの画像にトリミングしようとしています。未保存および未フィルタリングは、DB 内の他のテーブルを参照します。ユーザーは画像を保存したり、画像を作業用に安全にマークしたりできます...すべての画像を保存テーブルとフィルターテーブルに保持したいと思います。

最終的に、画像テーブルは (3,500 の保存されていない/フィルター処理されていない画像) + ("X" 保存済み)+("X" フィルター処理されていない) に切り詰められます。imagessaves/filters/images 間のリンクは、テーブル内のレコードに与えられた auto_incremented IDです。したがって、 saves には、テーブル内のレコードのキーを取得する image_id フィールドがありimagesます。フィルタ テーブルと同じ

//connect to database
$connect = xxxxxxxxxxx;


//GET ALL IMAGES FROM `images` Table - NEWEST FIRST (`id` is auto_increment)
$sql = mysql_query("SELECT * FROM `images` ORDER BY `id` DESC") or die(mysql_error());
$x = 0;
while($row = mysql_fetch_array($sql)){
    //GET CURRENT IMAGES ID AND URL
    $id = $row['id'];
    $file = $row['url'];

    //SEE IF IMAGE IS IN THE saves Table
    $saves = mysql_query("SELECT `id` FROM `saves` WHERE `img_id` = '".$id."'") or die(mysql_error());
    if(mysql_num_rows($saves) == 0){$saved = FALSE;}
    else {$saved = TRUE;}

    //SEE IF IMAGE IS IN THE filters Table
    $filter = mysql_query("SELECT `id` FROM `filter` WHERE `img_id` = '".$id."'") or die(mysql_error());
    if(mysql_num_rows($filter) == 0){$filtered = FALSE;}
    else {$filtered = TRUE;}

    //If the image has not been saved or filtered then put it in a que for deletion
    if(!$saved || !$filtered){
        $IdQue[$x] = $id;
        $FileQue[$x] = $file;
        $x++;
    }//END if   
}//END while

//Process the delete que: Delete node from database, delete file on server. Keep 3,500 of the newest images.
for($i=3500; $i<$x; $i++){
    mysql_query("DELETE FROM `images` WHERE id='".$IdQue[$i]."' LIMIT 1") or die("line 33".mysql_error());

    if(file_exists($FileQue[$i])){
        unlink($FileQue[$i]) or die("file Not deleted");
    }//END if
}//END for
echo ($i-3500)." files deleted<br/>";

//terminate connection
mysql_close($connect);
4

1 に答える 1

0

ただし、これは完全なコードではなく、どこかに行く必要があります。

まず、選択 ID を 2 つのクエリに減らします。

$missing_from_filters = SELECT id FROM images WHERE img_id NOT IN (SELECT img_id FROM filter)
$missing_from_saves = SELECT id FROM images WHERE img_id NOT IN (SELECT img_id FROM saves)

次に、両方の配列にある ID を取得します

$to_delete = array_intersect($missing_from_filters,$missing_from_saves);

1 つのクエリを実行してすべてを削除する

$remove_query = 'DELETE FROM images WHERE img_id IN ( '.implode(',',$to_delete).') LIMIT 3500';
于 2013-03-08T14:05:25.610 に答える