选择所有具有A = B OR C = D EXCEPT的行,其中ID = foo在MySQL中

时间:2015-01-29 19:31:30

标签: 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

之前我在SQLite3中运行它,它可以正常运行。但由于MySQL不支持EXCEPT,因此在MySQL中不起作用:

SELECT COUNT(*) FROM user WHERE username = :username OR email = :email EXCEPT SELECT COUNT(*) FROM user WHERE user_id = :user_id

提前致谢!

3 个答案:

答案 0 :(得分:2)

将括号括在OR:

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

如果没有它们,AND将在OR之前进行评估,因为它有higher priority,它等同于:

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

答案 1 :(得分:1)

我认为你在这里犯了一个普遍的错误。你在where子句中使用OR和AND而没有put()。以下示例应该可以工作:

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

您可以查看operator precedence in my sql

答案 2 :(得分:1)

正确位置的几个括号将解决您的问题:

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

他们改变了评估条件的方式。逻辑运算符AND的优先级高于OR运算符。这就是它们在所有编程语言中的工作方式,因为这是在编程语言出现之前很久就被数学理论定义的。

括号强制执行所需的评估顺序。