22

どのようにまたは/および機能するのだろうか?

たとえば、display = 1 のすべての行を取得したい場合

私はただすることができますWHERE tablename.display = 1

そして、display = 1または2のすべての行が必要な場合

私はただすることができますWHERE tablename.display = 1 or tablename.display = 2

しかし、display = 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%")

4

4 に答える 4

51

MySQLのドキュメントには、どの演算子が優先されるかについての情報が記載された優れたページがあります。

そのページから、

12.3.1。演算子の優先順位

次のリストに、優先順位の高いものから低いものへと、演算子の優先順位を示します。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 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%")
    )
于 2012-09-10T05:15:34.947 に答える
3

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:OperatorPrecedenceを参照してください。

于 2012-09-10T05:04:41.377 に答える
0

すべてのSQLサーバーで、ANDが優先されるため、 sORを角かっこで囲むことを忘れないでください。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)です。

于 2012-09-10T05:04:16.657 に答える