MySQL name LIKE '% # attribute.q #%' --- Не возвращает результат для точного соответствия? - PullRequest
0 голосов
/ 14 марта 2010

У меня следующий запрос MySQL:

SELECT  *
FROM    customer
WHERE   
fName LIKE '%#attributes.q#%' AND deleted = 'N'
OR 
lName LIKE '%#attributes.q#%' AND deleted = 'N'

Это хорошо работает для догадок, но если вы укажете точное совпадение: "Билл Клинтон" fname = bill lname = clinton в запросе выше, вы получите 0 результатов? где Билл Клинт дает результаты.

Как обновить этот запрос, сказав, что он найден как LIKE и EQUAL TO?

Ответы [ 2 ]

2 голосов
/ 15 марта 2010

Трудно сказать по вашему вопросу, но я предполагаю, что таблица ваших клиентов будет выглядеть примерно так:

id    fName    lName      deleted
---------------------------------
1     John     Doe        N
2     Bill     Clinton    N
3     Fred     Smith      N
4     George   Bush       Y

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

SELECT *
FROM customer
WHERE fname LIKE '%Bill Clinton%' AND deleted = 'N'
OR
  lName LIKE '%Bill Clinton%' AND deleted = 'N'

Нет записей в таблице, где поля fName ИЛИ lName содержат "Билл Клинтон"

Вам нужно помассировать текст # attribute.q #, чтобы он генерировал что-то вроде этого:

SELECT *
FROM customer
WHERE ((fName LIKE '%Bill%') OR (fName LIKE '%Clinton%')) AND deleted = 'N'
OR
   ((lName LIKE '%Bill%') etc.....

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

Я думаю, что вам нужен ПОЛНЫЙ ТЕКСТ , который будет рассматривать отдельные слова в строке запроса и возвращать результаты. Конечно, FULLTEXT доступен только для типов таблиц MyISAM, поэтому, если вы используете InnoDB или какой-либо другой тип, вам не повезло.

0 голосов
/ 17 декабря 2018

FYI - полнотекстовые индексы могут использоваться только с таблицами InnoDB или MyISAM и могут создаваться только для столбцов CHAR, VARCHAR или TEXT.

...