2016-05-17 49 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"