选择所有A=B或C=D的行,MySQL中ID=foo的行除外

选择所有A=B或C=D的行,MySQL中ID=foo的行除外,mysql,sql,Mysql,Sql,我正在尝试选择与任何用户具有相同用户名或电子邮件的所有行,ID为7的除外 但现在它返回实际具有ID 7的行。我在想,也许您可以对SQL进行一些分组来解决这个问题 谁能告诉我怎么了 这是我在MySQL中尝试使用的SQL: SELECT user_id FROM user WHERE username = "my_username" OR email = "my@email.com" AND user_id != 7 SELECT COUNT(*) FROM user WHERE username

我正在尝试选择与任何用户具有相同用户名或电子邮件的所有行,ID为7的除外

但现在它返回实际具有ID 7的行。我在想,也许您可以对SQL进行一些分组来解决这个问题

谁能告诉我怎么了

这是我在MySQL中尝试使用的SQL:

SELECT user_id FROM user WHERE username = "my_username" OR email = "my@email.com" AND user_id != 7
SELECT COUNT(*) FROM user WHERE username = :username OR email = :email EXCEPT SELECT COUNT(*) FROM user WHERE user_id = :user_id
上一次我在SQLite3中运行了它,它可以很好地实现这一目的。但是,由于MySQL不支持,除了在MySQL中不起作用之外:

SELECT user_id FROM user WHERE username = "my_username" OR email = "my@email.com" AND user_id != 7
SELECT COUNT(*) FROM user WHERE username = :username OR email = :email EXCEPT SELECT COUNT(*) FROM user WHERE user_id = :user_id

提前谢谢

在或周围加括号:

SELECT user_id
FROM user
WHERE (username = "my_username" OR email = "my@email.com")
AND user_id != 7
如果没有它们,
将在
之前进行评估,因为它有并且相当于:

SELECT user_id
FROM user
WHERE username = "my_username"
   OR (email = "my@email.com" AND user_id != 7)

在或周围加括号:

SELECT user_id
FROM user
WHERE (username = "my_username" OR email = "my@email.com")
AND user_id != 7
如果没有它们,
将在
之前进行评估,因为它有并且相当于:

SELECT user_id
FROM user
WHERE username = "my_username"
   OR (email = "my@email.com" AND user_id != 7)

我认为你犯了一个普遍的错误。在where子句中使用了OR和and,但没有放入()。我想下面的例子应该有用:

SELECT user_id FROM user 
WHERE (username = "my_username" OR email = "my@email.com") AND user_id != 7

你可以看看

我认为你在这里犯了一个普遍的错误。在where子句中使用了OR和and,但没有放入()。我想下面的例子应该有用:

SELECT user_id FROM user 
WHERE (username = "my_username" OR email = "my@email.com") AND user_id != 7

您可以看一看

在正确的位置放几个括号可以解决您的问题:

SELECT user_id
FROM user
WHERE (username = "my_username" OR email = "my@email.com") AND user_id != 7
它们改变了评估条件的方式。逻辑运算符
的优先级高于
运算符。这就是它们在所有编程语言中的工作原理,因为在编程语言出现之前,数学理论就是这样定义的


括号强制执行所需的求值顺序。

在正确的位置使用两个括号可以解决您的问题:

SELECT user_id
FROM user
WHERE (username = "my_username" OR email = "my@email.com") AND user_id != 7
它们改变了评估条件的方式。逻辑运算符
的优先级高于
运算符。这就是它们在所有编程语言中的工作原理,因为在编程语言出现之前,数学理论就是这样定义的


括号强制执行所需的求值顺序。

AND和OR语句周围的括号通常会有所帮助。目前,系统会返回任何具有“my_用户名”的用户或具有“my_用户名”的用户my@email.com“其用户_Id不是7。在没有()的情况下,引擎会处理语句的每一侧,然后一起应用or。AND和or语句周围的括号通常会有所帮助。目前,系统会返回任何具有“my_username”的用户或具有“my_username”的用户my@email.com“其用户_Id不是7。在没有()的情况下,引擎处理语句两侧的语句,然后一起应用or。