2016-12-08 6 views
1

を使用して、ローカルの&リモートmysql dbを比較しています。
私はセットアップに次の値が含まれている比較から任意の行を除外し、単純なWHERE句しようとしている:私が使用している節が動作していないようですザ・mysql where同じ列にある2つの異なる値に基づいて行を除外する理由

%mmまたは%transient%

を。

'option_name' NOT LIKE '%_transient_%' OR '%mm%'

実行している完全なクエリは次のとおりです。

SELECT 'option_id', 'option_name', 'option_value', 'autoload' 
FROM 'wp_options WHERE 'option_name' NOT LIKE '%_transient_%' OR '%mm%' 

し、得られた出力はOPTION_NAME列にmmまたは_transient_を持つ行を排除するものではありません。

ここで注意しなければならないのは、WHERE句のみを使用することです。&これまでのSELECT句を編集することはできません。

+3

それはOPTION_NAMEは '%_transient_%' のようなNOT AND OPTION_NAMEは好きでは 'でなければなりません '%のミリメートル%' 列名用の単一引用符を使用しません.also'文字列定数として扱われるためです。バッククォート(mysql)または二重引用符を使用します。 –

+0

http://stackoverflow.com/questions/11321491/when-to-use-single-quotes-double-quotes-and-backticks – Barmar

+0

これは誤植であるかどうかわかりませんが、テーブル名はisnです。引用符で囲まれていない –

答えて

2

複数のパターンと比較すると、LIKEという形式はありません。コメントで述べた@vkpよう

(彼らは答えを投稿していない理由を私は知らない)、あなたの状態はあなたが意図し何を行うことはありません。

WHERE option_name NOT LIKE '%_transient_%' OR '%mm%' 

それは中構文エラーではありませんMySQLの場合、ORは任意の式をオペランドとして使用できます。ゼロ値は偽とカウントされ、ゼロ以外の値は真とカウントされます。だからあなたの条件は同等です:

WHERE (option_name NOT LIKE '%_transient_%') OR ('%mm%') 

と論理的に等価である:真値OR「は他の式と一緒にdのため、すべての行でtrueになりますどの

WHERE (option_name NOT LIKE '%_transient_%') OR (true) 

になります本当。

あなたの状態は、このようになります。

WHERE option_name NOT LIKE '%_transient_%' AND option_name NOT LIKE '%mm%' 
+0

優秀な説明。最初は、ANDを使用すると直感的でした。しかし、論理的な等価性の例は、ORの代わりにANDとなる理由を理解しています。ありがとう! –

+0

ええ、ブーリアン代数に慣れるのは良い考えです。 '(NOT A)AND(NOT B)'は 'NOT(A OR B)'と等しくなります。 –

関連する問題