我在用Laravel的ORM。它正在生成一个巨大的查询,在这个查询中,我注意到有一个WHERE语句重复自己,其中语句的顺序似乎非常重要。我相信这与MySQL如何分组WHERE语句有关,但我不明白MySQL是如何工作的。我在试着理解为什么这样做。mysql是如何解释/分组这个的?
表
items
-----------------------------------------------
id | status
-----------------------------------------------
19 | 1
20 | 0
21 | 1 需要结果:
-----------------------------------------------
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
结果
-----------------------------------------------
id | status
-----------------------------------------------
19 | 1
21 | 1 2)
SELECT * FROM items WHERE status = 1 OR id IN ('20')
结果
-----------------------------------------------
id | status
-----------------------------------------------
19 | 1
20 | 0
21 | 1 3)
SELECT * FROM items WHERE status = 1 OR id IN ('20') AND status = 1
结果
-----------------------------------------------
id | status
-----------------------------------------------
19 | 1
21 | 1 发布于 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);
即使你不加括号。
最好总是写括号,即使您知道不需要括号,也要向代码的其他读者(如果需要的话,也要向编译器/解释器)表明意图。
https://stackoverflow.com/questions/38271716
复制相似问题