首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql如何解释/分组重复WHERE语句和中间的OR语句?

问mysql如何解释/分组重复WHERE语句和中间的OR语句?
EN

Stack Overflow用户
提问于 2016-07-08 16:41:29
回答 1查看 23关注 0票数 0

我在用Laravel的ORM。它正在生成一个巨大的查询,在这个查询中,我注意到有一个WHERE语句重复自己,其中语句的顺序似乎非常重要。我相信这与MySQL如何分组WHERE语句有关,但我不明白MySQL是如何工作的。我在试着理解为什么这样做。mysql是如何解释/分组这个的?

表

代码语言:javascript
复制
items
-----------------------------------------------
id       |    status
-----------------------------------------------
19       |    1 
20       |    0 
21       |    1   

需要结果:

代码语言:javascript
复制
-----------------------------------------------
id       |    status
-----------------------------------------------
19       |    1 
21       |    1 

查询的时间比这个长得多。但是,下面是ORM生成的代码,它产生了所需的上述结果:

SELECT * FROM campaigns WHERE status = 1 OR id IN ('20') AND status = 1 ORDER BY id DESC;

如果删除最后一个status = 1,查询将不返回所需的结果。MySQL将WHERE语句分组如下:

SELECT * FROM campaigns WHERE status = 1 OR (id IN ('20') AND status = 1);

ORM产生的查询只有几页长,因此在阅读时,如果没有括号,就会非常混乱。看起来MySQL是这样分组的。我想我不太明白MySQL是如何工作的。有任何关于书籍的建议来更好地理解MySQL吗?

建立查询/试图理解MySQL正在做什么

1)

SELECT * FROM items WHERE status = 1

结果

代码语言:javascript
复制
-----------------------------------------------
id       |    status
-----------------------------------------------
19       |    1 
21       |    1 

2)

SELECT * FROM items WHERE status = 1 OR id IN ('20')

结果

代码语言:javascript
复制
-----------------------------------------------
id       |    status
-----------------------------------------------
19       |    1 
20       |    0
21       |    1 

3)

SELECT * FROM items WHERE status = 1 OR id IN ('20') AND status = 1

结果

代码语言:javascript
复制
-----------------------------------------------
id       |    status
-----------------------------------------------
19       |    1 
21       |    1 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-08 16:51:00

AND优先于OR,参见SQL Logic Operator Precedence: And and Or。

就你的例子来说,这意味着

SELECT * FROM campaigns WHERE status = 1 OR id IN ('20') AND status = 1 ;

自动解释为

SELECT * FROM campaigns WHERE status = 1 OR (id IN ('20') AND status = 1);

即使你不加括号。

最好总是写括号,即使您知道不需要括号,也要向代码的其他读者(如果需要的话,也要向编译器/解释器)表明意图。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38271716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档