2013-04-12 40 views
1

我想拉取狀態列未標記爲'已刪除'的所有行並且如果update_datetime列早於7天(MySQL版本2013-04-11 11:22:44),則狀態標記爲「已完成」。select * WHERE status <>'deleted'OR status <>'completed'AND update_datetime <unix_timestamp(now() - interval 7 day)

這裏是我的軟弱和失敗的嘗試:

WHERE 
    status <> 'deleted' 
OR status <> 'completed' 
AND update_datetime < unix_timestamp(now() - interval 7 day) 
+3

記住,括號是你的朋友。 – Crontab

+0

我認爲從不使用括號的同一where子句中使用OR和AND,即使結果遵循操作順序,因爲一年後維護它的人不會知道你的意圖。 – HLGEM

+0

當'update_datetime'值不超過7天時,'status'值應該是多少?任何或必然*不*完成''(只要它不是「刪除」,當然)? –

回答

1
WHERE 
    status <> 'deleted' 
AND (
     (update_datetime < unix_timestamp(now() - interval 7 day) AND status = 'completed') 
    OR (update_datetime >= unix_timestamp(now() - interval 7 day)) 
) 

如果update_datetimeDATETIME列,而不是使用:

WHERE 
    status <> 'deleted' 
AND (
     (update_datetime < DATE_SUB(NOW(), INTERVAL 7 day) AND status = 'completed') 
    OR (update_datetime >= DATE_SUB(NOW(), INTERVAL 7 day)) 
) 
+0

得到了它的一個小的調整你的迴應工作: ' WHERE 狀態<> '刪除' AND( (UPDATE_DATETIME> DATE_SUB(NOW(),區間7日)和狀態= '完成') OR ( status <>'completed' ) )' –

+0

其實這不是你在描述你的問題時所說的,但我想最重要的是你的工作方式是你所希望的! – Sebas

+0

太正確了,你是......我很抱歉混淆。你完全按照我最初的要求回答。 –

0

你的意思呢?

WHERE 
    (status <> 'deleted' 
OR status <> 'completed') 
AND update_datetime < unix_timestamp(now() - interval 7 day) 

它等於

WHERE 
    (not status in ('deleted', 'completed')) 
AND update_datetime < unix_timestamp(now() - interval 7 day) 
+0

謝謝你解密我的sql的許多嘗試。我會盡量做得更詳細,因爲以上都沒有按預期工作。 –

相關問題