2012-10-24 112 views
0

我有2表的設置是這樣的:MYSQL多表刪除

Items: 
    id (int) 
    name (varchar) 
    category (int) 
    last_update (timestamp) 

Categories 
    id (int) 
    name (varchar) 
    tree_id (int) 

我想從Items刪除所有記錄,誰的last_update今天是不是和誰的相應categories.tree_id等於1。然而,我不希望從Categories表中刪除任何內容,只需要刪除Items表中的任何內容。我嘗試這樣做:

$query = "DELETE FROM items USING categories, items 
    WHERE items.category = categories.id 
    AND categories.tree_id = 1 
    AND items.last_update != '".date('Y-m-d')."'"; 

然而,這似乎只是刪除每一條記錄誰的tree_id是1。應該保持項目爲1的tree_id,只要他們last_updatetoday

我在想什麼?

回答

-1

你說last_update包含時間戳 - 我假設UNIX時間戳。您永遠無法找到與執行印記時具有相同時間戳的記錄,並且您無法將時間戳與格式化日期進行比較,他們永遠不會對應。因此,您需要以日期(Y-m-d)格式將數據存儲在last_update列中,以便比較那些不相等的數據。

+0

我明白了。好,謝謝! – djt

+0

請注意,MySQL時間戳字段與UNIX時間戳不相同。您現在唯一的問題是將時間戳字段(其中包含日期和時間組件)與只有日期值進行比較。這提出了一個包含日期字段(而不是時間戳或日期時間字段)的解決方案,它不會讓您知道last_update的H:m時間組件。 –

1

如果last_update是一個時間戳字段,並且你只是在你的where子句中傳入一個日期(沒有時間分量),那麼你本質上實際上是這樣做的(例如,如果在2012-10-24中傳遞):

AND items.last_update != 2012-10-24 00:00:00 

這意味着時間戳中沒有確切第二個值的每一行都將被刪除。你好得多做一些像

AND items.last_update NOT LIKE '".date('Y-m-d')."%'"; 

當然,你要確保你有一個索引last_update。

或者,如果您不關心last_update字段的索引性能(即,您只是將其作爲一次性查詢執行此操作並且不想索引此字段),則可以這樣做,這可能會使邏輯更具邏輯性對一些感覺

AND DATE(items.last_update) <> '".date('Y-m-d')."'" 

底線是,你只需要以某種方式比較last_updated字段的日期組件。

0

聽起來像是你需要一個子查詢

DELETE FROM items USING categories, items 
    WHERE items.category = categories.id 
    AND items.last_update != '".date('Y-m-d')."'" 
    AND items.id in 
    (
     SELECT id from items inner join categories on item.category = categories.id 
    )