MySQL SELECT 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"?
Спасибо
Ответы
Ответ 1
Хорошо, если вы знаете порядок своих слов.. вы можете использовать:
SELECT `name` FROM `table` WHERE `name` REGEXP 'Stylus.+2100'
Также вы можете использовать:
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%' AND `name` LIKE '%2100%'
Ответ 2
Я думаю, что лучшим решением было бы использование регулярных выражений. Это самый чистый и, вероятно, самый эффективный. Регулярные выражения поддерживаются всеми распространенными механизмами БД.
В 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
Ответ 3
Вы можете просто заменить каждое пространство %
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%2100%'
Ответ 4
Правильным решением является полнотекстовый поиск (если вы можете его использовать) 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
посмотрите http://www.techonthenet.com/sql/like.php
с LIKE '% Stylus 2100%' вы запрашиваете строку, содержащую именно "Stylus 2100", а "Stylus Photo 2100" не содержат эту строку, там "Фото" внутри;
Ответ 6
вам нужно сделать что-то вроде этого,
SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus.*2100';
или же
SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus)+.*(2100)+';
Ответ 7
Предполагая, что вы 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', ' ', ','));
Ответ 8
SELECT 'name' FROM 'table' WHERE 'name' LIKE '%Stylus % 2100%'