2011-11-15 135 views
-2

爲什麼WHERE子句中的第二個條件會被忽略?SQL忽略WHERE子句中的第二個條件

$old = time() - 2592000; 
$sql_deleteold = ("DELETE FROM todolist WHERE status='done' AND stamp < $old"); 
mysql_query($sql_deleteold); 

我想從狀態爲「已完成」的30天以前的數據庫中刪除數據。

相反,它會刪除狀態爲「已完成」的所有行。

+4

第二個陳述是什麼?如果你的意思是第二個條件表達式,那麼它將不會被「忽略」。沒有一個測試用例(或模式 - 什麼是「印記」?),你不能進一步得到幫助。 –

+0

什麼數據類型是'stamp'?如果它是MySQL'DATETIME'類型,則需要'FROM_UNIXTIME($ old)' –

+0

爲了試圖在SQL語句的各個部分與英語中的書寫語句之間建立一個類比,SQL語句的各個部分被調用「子句」和子句的部分稱爲「謂詞」。我在這裏假設他是第二個謂詞。 –

回答

2

我認爲你的問題是指SQL查詢中的「第二條語句」?

有了這個假設,所有行被刪除狀態爲「完成」的問題是因爲WHERE過濾器類似於「If」語句中使用的條件語句。

如果第一條語句或WHERE過濾條件爲true,則執行。

試着做以下幾點:

$old = time() - 2592000; 
$sql_deleteold = ("DELETE FROM todolist WHERE (status='done' AND stamp < $old)"); 
mysql_query($sql_deleteold); 

您還可能需要驗證的$值老在表格的「郵票」字段比較它的值,以確保有一些在'stamp'字段中的值大於$ old的值的行。

2

您是否嘗試過調試您的查詢?請不要刪除查詢請嘗試選擇值:

SELECT * FROM todolist WHERE status = 'done' AND stamp < $old 

是否選擇您期望的結果?如果它沒有繼續調整它,那麼嘗試刪除記錄。

+0

那着名的「SELECT * FRIN table」語法 –

+0

oops我的輸入錯誤,我改正了 –

+0

'$ odl'不行。 –

0

嘗試發行SELECT stamp FROM todolist,看看你得到什麼。據推測,它們的值將小於time() = 2592000

1

您可能有引用問題。可以肯定的,試試:

$sql_deleteold = "DELETE FROM `todolist` WHERE `status`='done' AND `stamp` < '".$old."';"; 

此外,當您插入字段,你設置用PHP $時間()$函數stamp場,或者它被SQL函數設置?因爲時間表示可能會根據stamp字段的類型而有所不同。