web-dev-qa-db-ja.com

MySQL SELECT LIKEまたはREGEXPは、1つのレコード内の複数の単語に一致します

フィールドtable.nameには、「Stylus Photo 2100」と次のクエリが含まれています

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus 2100%'

結果が得られません。もちろん、私が検索したら

SELECT `name` FROM `table` WHERE `name` LIKE '%Photo 2100%'

「スタイラス2100」を検索してレコードを選択するにはどうすればよいですか?

ありがとう

62
Alessio Firenze

あなたの言葉の順序を知っていれば...あなたは使用できます:

SELECT `name` FROM `table` WHERE `name` REGEXP 'Stylus.+2100'

また、使用することができます:

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%' AND `name` LIKE '%2100%'
102
SERPRO

最善の解決策は正規表現を使用することだと思います。最もきれいで、おそらく最も効果的です。正規表現は、一般的に使用されるすべての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

28
Ondrej Bozek

各スペースを%に置き換えることができます

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%2100%'
18
Melvin Protacio

正しい解決策はフルテキスト検索です(使用できる場合) 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"とも一致します。

5
Martin

http://www.techonthenet.com/sql/like.php をご覧ください

lIKE '%Stylus 2100%'では、正確に 'Stylus 2100'を含む文字列を要求し、 'Stylus Photo 2100'はその文字列を含まず、内部に 'Photo'があります。

3
divol

このようなことをする必要があります

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', ' ', ','));
0
Peter Darmis
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus % 2100%'
0
Gopalakrishnan