it-roy-ru.com

MySQL SELECT LIKE или REGEX для сопоставления нескольких слов в одной записи

Поле table.name содержит «Stylus Photo 2100» и со следующим запросом

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

Я не получаю результатов. Конечно, если бы я искал

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

Как выбрать запись, выполнив поиск «Stylus 2100»?

Спасибо 

56
Alessio Firenze

Хорошо, если вы знаете порядок ваших слов .. вы можете использовать:

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

Также вы можете использовать:

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

Я думаю, что лучшим решением было бы использование регулярных выражений. Это самый чистый и, вероятно, самый эффективный. Регулярные выражения поддерживаются всеми распространенными механизмами БД.

В MySql есть оператор RLIKE, поэтому ваш запрос будет выглядеть примерно так:
SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus|2100'
Я не очень силен в регулярных выражениях, поэтому я надеюсь, что выражение в порядке.

Правка
RegExp должен быть:

SELECT * FROM buckets WHERE bucketname RLIKE '(?=.*Stylus)(?=.*2100)'

Подробнее о поддержке MySql regexp:
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%'
17
Melvin Protacio

Правильное решение - полнотекстовый поиск (если вы можете его использовать) https://dev.mysql.com/doc/refman/5.1/ru/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)+';
1
Mohideen ibn Mohammed

Предполагая, что ваш поиск 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

ВЫБРАТЬ name ОТ table ГДЕ name LIKE '% Stylus% 2100%'

0
Gopalakrishnan