次のように、特定の列の値(文字列$haystack
)に特定のデータ(文字列$needle
)が含まれているかどうかを確認するMySQLでクエリを作成する方法を見つけようとしています。
mysql_query("
SELECT *
FROM `table`
WHERE `column`.contains('{$needle}')
");
PHPでは、この関数はsubstr($haystack, $needle)
と呼ばれています。
WHERE substr(`column`, '{$needle}')=1
実はかなり単純です。
mysql_query("
SELECT *
FROM `table`
WHERE `column` LIKE '%{$needle}%'
");
%
は任意の文字のワイルドカードです。非常に大きなデータセットではこれが遅くなる可能性があるので注意してください。データベースが大きくなったらフルテキストインデックスを使う必要があります。
WHERE `column` LIKE '%$needle%'
Mineはmysqlで LOCATE
を使用しています。
LOCATE(substr、str)、LOCATE(substr、str、pos)
この関数はマルチバイトセーフであり、少なくとも1つの引数がバイナリ文字列の場合にのみ大文字と小文字が区別されます。
あなたの場合:
mysql_query("
SELECT * FROM `table`
WHERE LOCATE('{$needle}','column') > 0
");
@WoLpHからの回答に加えて。
LIKE
キーワードを使用すると、文字列が一致する方向を制限することもできます。例えば:
あなたの$needle
で始まる文字列を探していたら:
... WHERE column LIKE '{$needle}%'
$needle
で終わる文字列を探しているなら、
... WHERE column LIKE '%{$needle}'
これは危険であることに注意してください。
WHERE `column` LIKE '%{$needle}%'
最初にやる:
$needle = mysql_real_escape_string($needle);
だからそれは可能性のある攻撃を防ぐでしょう。
あなたはおそらく find_in_set
functionを探しています。
Where find_in_set($needle,'column') > 0
この関数は、PHPの in_array
functionのように機能します。