2014-02-18 45 views
0

我並不是超級棒的SQL。我正在過濾一個具有以下內容的concrete5集合,不知道如何讓它全部工作。如何正確使用括號來區分AND和OR語句?SQL如何正確使用括號來分隔AND和OR語句?

這並不做任何事情:

$this->filter(null, "(
       (DATE_SUB(expirationDate, INTERVAL 30 DAY) BETWEEN DATE_SUB(NOW(), INTERVAL 3 DAY) AND NOW()) 
       OR 
       (DATE_SUB(expirationDate, INTERVAL 5 DAY) BETWEEN DATE_SUB(NOW(), INTERVAL 3 DAY) AND NOW()) 
       OR 
       (DATE_SUB(expirationDate, INTERVAL 1 DAY) BETWEEN DATE_SUB(NOW(), INTERVAL 3 DAY) AND NOW()) 
      ) 
      AND 
      (DATE_ADD(warnedDate, INTERVAL 4 DAY) <= NOW())"); 

這一次主要是工程(繞之前的語句刪除括號),但似乎並沒有後和...。「DATE_ADD該條款過濾( warnedDate,INTERVAL 4 DAY)< = NOW())「:

$this->filter(null, " 
       (DATE_SUB(expirationDate, INTERVAL 30 DAY) BETWEEN DATE_SUB(NOW(), INTERVAL 3 DAY) AND NOW()) 
       OR 
       (DATE_SUB(expirationDate, INTERVAL 5 DAY) BETWEEN DATE_SUB(NOW(), INTERVAL 3 DAY) AND NOW()) 
       OR 
       (DATE_SUB(expirationDate, INTERVAL 1 DAY) BETWEEN DATE_SUB(NOW(), INTERVAL 3 DAY) AND NOW()) 

      AND 
      (DATE_ADD(warnedDate, INTERVAL 4 DAY) <= NOW())"); 
+0

您的第一個陳述似乎是正確的。嘗試刪除'AND(DATE_ADD(warnedDate,INTERVAL 4 DAY)<= NOW())「);'以驗證'OR'邏輯是否按預期工作,然後將其添加回來。 DATE_SUB(expirationDate,INTERVAL 5 DAY)在DATE_SUB(NOW(),INTERVAL 3 DAY)和NOW()之間的邏輯「OR」來確保邏輯是正確的(somelogic或somelogic)和(someothericlogic)' – 2014-02-18 17:29:00

+0

'或 或 (DATE_SUB(expirationDate,INTERVAL 1 DAY)DATE_SUB(NOW(),INTERVAL 3 DAY)和NOW())' 不做任何事情,因爲您的第一個條件(30天)包括5天和1天的間隔現在如此刪除它們 –

+0

@SaUce OR邏輯似乎是工作沒有AND和語句處理它..我想知道爲什麼當AND ..在那裏它不起作用.. – CaitlinHavener

回答

0

正如註釋的兩項條文第5天第1天是冗餘提到的,因爲在30天的間隔,以今天已經包括5,1一天到今天如此刪除它們。 嘗試是這樣的

(DATE_SUB(expirationDate, INTERVAL 30 DAY) BETWEEN DATE_SUB(NOW(), INTERVAL 3 DAY) AND NOW()) 
AND 
(DATE_ADD(warnedDate, INTERVAL 4 DAY) <= NOW()) 

注意:當你想兩個條件爲至少一個條件是真實OR是真實AND使用。

+0

這也不起作用:(該程序正在過濾用戶的會員在到期前30天,5天和1天過期並通知他們。它會在警告用戶時插入時間戳(warnedDate)。我將過期日期放在一個的用戶從現在起30天內沒有通知,另外,如果我想通知30,5和1天前,我不需要那些您刪除的聲明嗎? – CaitlinHavener

+0

好的我馬上更新我的答案根據信息 –

+0

這似乎適用於我的測試數據,你不需要這些語句在OR中,因爲任何在30天之內的截止日期直到今天已經在5天(或1天)到今天的範圍內 –