我正在尝试选择与任何用户具有相同用户名或电子邮件的所有行,但不包括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
提前致谢!
答案 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
答案 2 :(得分:1)
正确位置的几个括号将解决您的问题:
SELECT user_id
FROM user
WHERE (username = "my_username" OR email = "my@email.com") AND user_id != 7
他们改变了评估条件的方式。逻辑运算符AND
的优先级高于OR
运算符。这就是它们在所有编程语言中的工作方式,因为这是在编程语言出现之前很久就被数学理论定义的。
括号强制执行所需的评估顺序。