我的表架构如下:
+------+-------+-------+
| id | name1 | name2 |
+------+-------+-------+
| 1 | A | B |
| 2 | A | C |
| 3 | B | A |
| 4 | C | D |
+------+-------+-------+
我按如下方式使用查询:
select * from t where name1='A' or name1='B' and name2='C';
结果如下
+------+-------+-------+
| id | name1 | name2 |
+------+-------+-------+
| 1 | A | B |
| 2 | A | C |
+------+-------+-------+
这个结果是如何产生的,以及
我希望返回 name1 为 A 或 B 且名称 2 为"B"的行的查询
查询结果应该是这样的
+------+-------+-------+
| id | name1 | name2 |
+------+-------+-------+
| 1 | A | B |
+------+-------+-------+
我想要仅使用"AND"和"OR"操作的查询结果...
我建议你阅读布尔逻辑。这是一个非常简单的操作,所以如果你熟悉B.L.,你就可以自己做这个。
话虽如此,这两个状态将完成您想要的:
SELECT ... WHERE (name1 IN ('A', 'B')) AND (name2 = 'B')
SELECT ... WHERE ((name1 = 'A') or (name1 = 'B')) AND (name2 = 'B')
通过添加括号对条件进行分组
select * from t where (name1='A' or name1='B') and name2='B';
或使用IN
select * from t where name1 IN ('A','B') and name2='B';
你应该使用括号
select * from t where name1='A' or name1='B' and name2='C';
应该是
select * from t where (name1='A' or name1='B') and name2='B';
select * from t where (name1='A' or name1='B') and name2='B';
这是一个优先级问题。B 和 C 子句绑定在一起,这意味着您将获得:
select * from t where name1='A' or (name1='B' and name2='B');
所以你需要做的是自己显式绑定子句:
select * from t where (name1='A' or name1='B') and name2='B';
(假设您在陈述的查询中使用 C 是一个错字,因为它与您的问题的其余部分不匹配)。