2012-10-18 117 views
2

基本上我試圖削減圖像表下降到3500行未保存的或未經過濾的圖像更有效的方式。未保存和未過濾引用數據庫中的其他表。用戶可以保存圖像以及將圖像標記爲可以安全工作等...我想將所有圖像保存在保存表格以及過濾表格中。有一定是要做到這一點

最終,這些圖像表將得到修剪成(3,500未保存/未經過濾的圖像)+( 「X」 保存)+( 「X」 未過濾)。保存/過濾器/圖像之間的鏈接是images表中記錄的auto_incremented id。所以保存有一個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); 
+1

是否有你的arent做這一切在查詢喜歡的人在你的問題建議一天一個原因嗎? – prodigitalson

+1

是的,我在解除鏈接的一部分時遇到了問題 – user1290323

+0

啊...... gothca! – prodigitalson

回答

0

這應該讓你去的地方,而不是一個完整的代碼,但:

一,板帶選擇IDS下降到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) 

然後,讓IDS在兩個陣列中

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

運行一個查詢以將它們全部刪除

$remove_query = 'DELETE FROM images WHERE img_id IN ('.implode(',',$to_delete).') LIMIT 3500'; 
相關問題