Mysql或/和优先?

我想知道如何或/和作品?

例如,如果我想获得所有行的显示= 1

我可以做WHERE tablename.display = 1

如果我想显示所有行的显示= 1或2

我可以做WHERE tablename.display = 1 or tablename.display = 2

但是,如果我想获取显示为1或2的所有行,并且其中任何内容,标记或标题包含hello world

这个逻辑将如何发挥呢?

 Select * from tablename where display = 1 or display = 2 and content like "%hello world%" or tags like "%hello world%" or title = "%hello world%" 

会是我的猜测。 但是我可以用几种方法来阅读。

它读作为:

  (display = 1 or display = 2) and (content like "%hello world%" or tags like "%hello world%" or title = "%hello world%") 

或如

 ((display = 1 or display = 2) and (content like "%hello world%")) or (tags like "%hello world%" or title = "%hello world%") 

等等

MySQL文档有一个很好的页面 ,提供哪些操作符优先。

从那页,

12.3.1。 运算符优先级

运算符优先级显示在以下列表中,从最高优先级到最低优先级。 一起显示在一行上的运算符具有相同的优先级。

 INTERVAL BINARY, COLLATE ! - (unary minus), ~ (unary bit inversion) ^ *, /, DIV, %, MOD -, + <<, >> & | = (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN BETWEEN, CASE, WHEN, THEN, ELSE NOT &&, AND XOR ||, OR = (assignment), := 

所以你原来的查询

 Select * from tablename where display = 1 or display = 2 and content like "%hello world%" or tags like "%hello world%" or title = "%hello world%" 

将被解释为

 Select * from tablename where (display = 1) or ( (display = 2) and (content like "%hello world%") ) or (tags like "%hello world%") or (title = "%hello world%") 

如有疑问,请使用括号使您的意图清楚。 虽然MySQL页面上的信息是有帮助的,但是如果查询被重新访问,可能不会立即显而易见。

你可能会考虑如下的东西。 请注意,我已经将title = "%hello world%"更改为title = "%hello world%"这样的title like "%hello world%" ,因为这更符合您所描述的目标。

 Select * from tablename where ( (display = 1) or (display = 2) ) and ( (content like "%hello world%") or (tags like "%hello world%") or (title like "%hello world%") ) 

你需要为你的多个OR条件使用括号。 而对于display = 1 OR display = 2您可以使用display IN(1,2) 。 尝试这个:

 SELECT * FROM tableName WHERE display IN (1,2) AND (content LIKE "%hello world%" OR tags LIKE "%hello world%" OR title LIKE "%hello world%") 

有关更多信息,请参阅MySQL:运算符优先级

运行这个查询:

 select 1 or 1 and 0 

如果它出现为1 ,那么这意味着优先级是:

 select 1 or (1 and 0) 

如果它出来0 ,那么优先级是:

 select (1 or 1) and 0 

扰stream板:它出来1

也就是说, AND在s或之前被评估,或者正如我想说的,ANDs是粘性的。

在所有的SQL服务器中, AND优先于OR ,所以只要记得在你的OR放上括号:

 select * from tablename where (display = 1 or display = 2) and (content like "%hello world%" or tags like "%hello world%" or title = "%hello world%") 

btw (display = 1 or display = 2)相当于display in (1, 2)