MySql Regular Expression Select Columns Соответствие (динамическое) нескольким значениям в хранимой процедуре - PullRequest
2 голосов
/ 01 октября 2010

Я пытаюсь создать запрос, в котором я хочу выбрать столбцы (текст), соответствующие нескольким значениям.

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

Google это веб-сайт и потрясающий поисковая система

, вторая строка со значением столбца описания

Сайт Amazon - это потрясающая электронная коммерция магазин

Я создал запрос

Выбрать * из table_name где описание REGEXP 'Сайт \ | Поиск '

Возвращает обе строки, т.е. как с Google, так и с Amazon, но я хочу вернуть только Google, так как я хочу, чтобы эти строки содержали оба слова: website и search и количество Слова, которые должны быть сопоставлены, также не являются фиксированными, в основном, я создаю запрос для выпадающего списка поиска,

Все пропущенные слова должны присутствовать в столбце, порядок слов в столбце не имеет значения. Если есть и другие лучшие варианты, кроме использования регулярных выражений, пожалуйста, укажите.

Редактирование: количество пропущенных слов является динамическим и неизвестным; пользователь может передать дополнительные слова для сопоставления со столбцом. Я буду использовать запрос в хранимой процедуре

1 Ответ

1 голос
/ 01 октября 2010

Действительно не думаю, что решение регулярных выражений будет хорошим для вас с точки зрения производительности. Думаю, вам следует искать ПОЛНЫЙ текстовый поиск.

В частности, вам нужно создать полнотекстовый индекс, например, в определении таблицы:

create table testTable
(
Id int auto_increment not null,
TextCol varchar(500)
fulltext(TextCol)
); 

Тогда ваш запрос станет проще:

select * from testTable where Match(TextCol) against ('web') 
AND Match(TextCol) against ('server')

Настоятельно рекомендуем вам прочитать документы MySQL относительно соответствия FULLTEXT, и есть много маленьких хитростей и функций, которые будут полезны в этой задаче (включая более эффективные способы выполнения запроса выше)

Редактировать: Возможно, логический режим поможет вам найти простое решение, подобное этому:

Match(textCol) against ('web+ Server+' in boolean mode)

Все, что вам нужно сделать, это построить строку против, так что я думаю, что это можно сделать в SP без динамического SQL

...