【问题标题】:Select nested AND OR. How?选择嵌套 AND OR。如何?
【发布时间】:2013-04-08 19:07:52
【问题描述】:

下面我有一个 SQL 查询,它作为登录脚本供选择输入用户名或电子邮件的用户使用。

我注意到,尽管它似乎会检查其中一个或作为登录凭据,但不会。

username1 OR username1@email.com = 仅通过用户名真正查找

SELECT * 
FROM tblaccount 
WHERE acc_user='username1' OR acc_email='username1@email.com' 
  AND acc_password='letmein1' AND acc_confirmed='1' AND acc_active='1'

...如果我把它改成...

username0 OR username1@email.com = 它不返回记录。

有什么想法吗?

【问题讨论】:

  • AND 的优先级高于 OR。您可以使用括号或acc_user IN ('username1', 'username1@email.com')
  • 使用括号。 AND 优先于 OR,因此第二个 OR 与 AND 一起执行,然后与第一个 OR 一起执行。
  • 请记住,您不应该以明文形式存储密码。身份验证和安全性很难做好 - 最好使用适合您的开发语言的库。
  • 当然。为了简单起见,只是以这种方式发布。

标签: mysql sql comparison


【解决方案1】:

OR 在这些条件周围加上括号:

SELECT * FROM tblaccount 
WHERE (acc_user = 'username1' OR acc_email = 'username1@email.com' )
   AND acc_password  = 'letmein1' 
   AND acc_confirmed = '1' 
   AND acc_active    = '1';

【讨论】:

  • @Vini - 您需要添加更多细节才能获得有用的响应。你还尝试了什么?您的数据库中有哪些数据?尝试将所有有用和必要的信息添加到您的问题中。更好的是,用 SQL Fiddle 向我们展示你有什么 - 否则我们只是在猜测。
  • 不,你是对的。 acc_confirmed 和 acc_active 字段当时设置为 0。非常感谢。
【解决方案2】:

Mahmoud 的解决方案是正确的。您必须阅读 mysql 中的运算符优先级。

http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html

由于OR 的优先级低于AND,您必须按照Mahmoud 提供的方式将OR 放在括号内。

【讨论】:

    猜你喜欢
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2013-09-08
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多