フィールドtable
.name
には、「Stylus Photo 2100」と次のクエリが含まれています
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus 2100%'
結果が得られません。もちろん、私が検索したら
SELECT `name` FROM `table` WHERE `name` LIKE '%Photo 2100%'
「スタイラス2100」を検索してレコードを選択するにはどうすればよいですか?
ありがとう
あなたの言葉の順序を知っていれば...あなたは使用できます:
SELECT `name` FROM `table` WHERE `name` REGEXP 'Stylus.+2100'
また、使用することができます:
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%' AND `name` LIKE '%2100%'
最善の解決策は正規表現を使用することだと思います。最もきれいで、おそらく最も効果的です。正規表現は、一般的に使用されるすべてのDBエンジンでサポートされています。
MySqlにはRLIKE
演算子があるため、クエリは次のようになります。SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus|2100'
私は正規表現があまり得意ではないので、表現が問題ないことを願っています。
編集
RegExpは次のようになります。
SELECT * FROM buckets WHERE bucketname RLIKE '(?=.*Stylus)(?=.*2100)'
MySql正規表現サポートの詳細:
http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp
各スペースを%
に置き換えることができます
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%2100%'
正しい解決策はフルテキスト検索です(使用できる場合) https://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
これはほとんどあなたが望むことをします:
SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus|2100)+.*(Stylus|2100)+';
SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*';
ただし、これは "210021002100"とも一致します。
http://www.techonthenet.com/sql/like.php をご覧ください
lIKE '%Stylus 2100%'では、正確に 'Stylus 2100'を含む文字列を要求し、 'Stylus Photo 2100'はその文字列を含まず、内部に 'Photo'があります。
このようなことをする必要があります
SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus.*2100';
または
SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus)+.*(2100)+';
検索がstylus photo 2100
であると仮定します。 RLIKE
を使用している次の例を試してください。
SELECT * FROM `buckets` WHERE `bucketname` RLIKE REPLACE('stylus photo 2100', ' ', '+.*');
編集
別の方法は、FULLTEXT
ステートメントでbucketname
およびMATCH ... AGAINST
構文にSELECT
インデックスを使用することです。したがって、上記の例を書き直すには...
SELECT * FROM `buckets` WHERE MATCH(`bucketname`) AGAINST (REPLACE('stylus photo 2100', ' ', ','));
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus % 2100%'