Имя mysql, как «%#attributes.q#%» - не возвращает результат для точного совпадения?
-
19-09-2019 - |
Вопрос
У меня есть следующий запрос MySQL:
SELECT *
FROM customer
WHERE
fName LIKE '%#attributes.q#%' AND deleted = 'N'
OR
lName LIKE '%#attributes.q#%' AND deleted = 'N'
Это прекрасно работает для догадок, но если вы предоставите точное совпадение: «Билл Клинтон» fname = Билл lname = Клинтон к запросу выше, вы получите 0 результатов? где Билл Клинт дает результаты.
Как можно обновить этот запрос, чтобы сказать, что найти результат и равный результатам?
Решение
Трудно сказать по вашему вопросу, но я предполагаю, что таблица ваших клиентов будет выглядеть как -то вроде:
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 содержат «Билл Клинтон»
Вам придется помассировать свой # attributes.q # текст, чтобы он генерировал что -то вроде этого:
SELECT *
FROM customer
WHERE ((fName LIKE '%Bill%') OR (fName LIKE '%Clinton%')) AND deleted = 'N'
OR
((lName LIKE '%Bill%') etc.....
Как сравнения очень похожи на использование подстановки в именах файлов. Они не разделяют для вас блок текста, но скажут вам, существует ли часть текста, дословно, внутри другой куски текста.
Я думаю, что вам нужно Полный текст поиск, который будет учитывать отдельные слова в строке запроса и вернуть результаты. Конечно, полный текст доступен только на типах таблиц Myisam, поэтому, если вы используете Innodb или какой -то другой тип, вам не повезло.
Другие советы
К вашему сведению - полнотекстовые индексы могут использоваться только с таблицами InnoDB или Myisam и могут быть созданы только для CHAR, VARCHAR или текстовых столбцов.