MySQL выберите LIKE или REGEXP, чтобы соответствовать нескольким словам в одной записи


поле 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'?

спасибо

6 54

6 ответов:

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

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

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

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

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

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

Edit
Регулярное выражение должно быть:

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

больше на Регулярное выражение MySql support:
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

с помощью типа "%Stylus 2100% "вы задаете строку, содержащую именно "Stylus 2100", а "Stylus Photo 2100" не содержит этой строки, внутри есть "фото";

вам нужно сделать что-то вроде этого,

SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus.*2100';

или

SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus)+.*(2100)+';