MySQL выбирает LIKE или REGEXP, чтобы соответствовать нескольким словам в одной записи
поле table
.name
содержит "Stylus Photo 2100" и со следующим запросом
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus 2100%'
Я не получаю результатов. Конечно, если бы я искал!--5-->
SELECT `name` FROM `table` WHERE `name` LIKE '%Photo 2100%'
как я могу выбрать запись, выполнив поиск 'Stylus 2100'?
спасибо
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'
Я не очень силен в regexp, поэтому я надеюсь, что выражение в порядке.
редактировать
Регулярное выражение должно быть:
SELECT * FROM buckets WHERE bucketname RLIKE '(?=.*Stylus)(?=.*2100)'
больше на MySQL regexp 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)+';