2016-04-04 2 views
0

У меня есть база данных с таблицей Publisher и столбец в этой таблице с именем Publisher_Name. Я хочу вернуть все имена, в которых есть слово «и», но не отдельные слова с «и» как последовательность внутри слова. Например, я хочу вернуть «Темзу и Хадсон», но не «Случайный дом».Запрос Mysql для возврата строк, содержащих определенное слово

Это единственный способ, которым я знаю, чтобы вернуть фразу с определенным словом.

SELECT PUBLISHER_NAME 
FROM PUBISHER 
WHERE PUBLISHER_NAME LIKE '%and%'; 

Приведенное выше утверждение, хотя будет возвращать вещи, как «Random House»

Как я могу изменить это заявление, чтобы вернуться только то, что я хочу?

ответ

0

Вы должны быть в состоянии сделать это, используя REGEXP

SELECT PUBLISHER_NAME 
FROM PUBISHER 
WHERE PUBLISHER_NAME REGEXP '[[:<:]]and[[:>:]]'; 

Это, кажется, работает, с помощью Barmar изменения Regex к чему-то MySQL делает принимаю :)

+0

Серьезно ... это было так просто я. искал в Интернете навсегда и не мог найти ничего, что говорило об этом. Большое вам спасибо. –

+0

Я угадываю, если последнее слово, и вы тоже этого хотите? – Jester

+1

MySQL не использует escape-последовательности PCRE. Используйте '[[: <:]]' и '[[:>:]]'. – Barmar

0

Я бы порекомендовал вам использовать MATCH...AGAINST но ваше PUBLISHER_NAME поле должно быть в FULLTEXT index

Вы можете найти некоторую информацию here

Ваш запрос будет выглядеть следующим образом:

SELECT PUBLISHER_NAME 
FROM PUBISHER 
WHERE MATCH (PUBLISHER_NAME) 
AGAINST ('and' IN NATURAL LANGUAGE MODE) 
0

При создании FULLTEXT INDEX на этой колонке, чем вы можете осуществлять поиск отдельных слов. Если вы используете это решение, убедитесь, что вы изменили минимальную проиндексированную длину слова (ft_min_word_len или innodb_ft_min_token_size) до 3 или ниже и переопределите список заметок по умолчанию (ft_stopword_file или innodb_ft_enable_stopword, чтобы удалить слово «и» и любые другие распространенные слова, которые вы хотите индексировать .

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

SELECT PUBLISHER_NAME 
FROM PUBISHER 
WHERE PUBLISHER_NAME LIKE '% and %' 
OR PUBLISHER_NAME LIKE 'and %' 
OR PUBLISHER_NAME LIKE '% and'; 
+0

Ваш запрос по-прежнему будет соответствовать 'random house'. Вам нужно вынуть '% и%'. – Barmar

+0

@ Бармар, вы правы. Я забыл пробелы. Исправлено. Благодаря! –

Смежные вопросы