2016-05-17 52 views
3

我正在嘗試從此數據庫中刪除SELECTWHERE要麼statement_from要麼= $username但是,這不能正常工作。我查看了以前問過的類似問題,但不確定如何在此查詢中實現以前的答案。SQL WHERE,OR和AND

"SELECT * FROM `usr_statements` WHERE `statement_from` = '$username' 
    OR `username` = '$username' AND `statement_timestamp` > '$start_date' 
    AND `statement_timestamp` < '$end_date' ORDER BY `statement_ref` DESC" 

我試圖做到的,是選擇數據庫中的所有結果,其中statement_fromusername是=到$username

+1

你可以在'(...)中的$ username(statement_from,username)...'使代碼更加明顯! – jarlh

+1

查看使用大於或等於大於等於的日期範圍會更常見,例如'> = $ start_date AND statement_timestamp <$ end_date' –

+1

@Used_By_Already這是非常正確的。我假設,如果一個交易是在下一個報表日期生成的確切秒內進行的,它不會在任何一個報表上顯示。 –

回答

8

目前查詢驗證這樣

WHERE `statement_from` = '$username' 
    OR (`username` = '$username' AND `statement_timestamp` > '$start_date') 
    AND `statement_timestamp` < '$end_date' 

因爲AND更高優先級比OR所以AND將首先評估。

您需要添加合適的括號

SELECT * FROM `usr_statements` 
WHERE (`statement_from` = '$username' 
    OR `username` = '$username') 
    AND `statement_timestamp` > '$start_date' 
    AND `statement_timestamp` < '$end_date' 
ORDER BY `statement_ref` DESC 

您也可以使用IN運營商要做到這一點,通過Jarlh在評論

SELECT * FROM `usr_statements` 
WHERE $username in (statement_from, username) 
    AND `statement_timestamp` > '$start_date' 
    AND `statement_timestamp` < '$end_date' 
ORDER BY `statement_ref` DESC 
+1

只是括號然後ahaha,我真的很感激快速的迴應。謝謝。 –

+1

我會說同樣的,請添加邏輯運算符的優先級來完成;) – AxelH

+1

Thankyou改變你的答案來解釋運營商擁有它的更高和更低優先級真的很有用,並認爲這將有助於我理解運營商的秩序未來。 –

0

提到的運算符的優先級是NOT - >AND - >OR,所以你需要一些parentesis在這裏:

"SELECT * FROM `usr_statements` WHERE (`statement_from` = '$username' 
    OR `username` = '$username') AND `statement_timestamp` > '$start_date' 
    AND `statement_timestamp` < '$end_date' ORDER BY `statement_ref` DESC"