Проблема с LIKE-запросом.
Суть проблемы -
Клиентская база данных. На форме есть ОДНО поле-input в которое пользователь вводит first_name и last_name клиента.
Составляю запрос типа
WHERE first_name LIKE '%$keyword%' //$keyword - переменная PHP
Как мне организовать запрос в случае, если пользователь в input введёт имя И фамилию? к примеру 'Василий Иванов'?
Заранее спасибо, надеюсь растолковал:).
Как мне организовать запрос в случае, если пользователь в input введёт имя И фамилию? к примеру 'Василий Иванов'?
Лучше всего не париться, а добавить второе поле, чтобы не пытаться обработать различный ввод пользователя (сначала имя потом фамилия, сначала фамилия потом имя, имя и фамилия с одним пробелом между, с двумя ну и т.п.).
Дайте пользователю наименьшие привелегии и вам же будет легче :)
Дайте пользователю наименьшие привелегии и вам же будет легче :)
Да в том то и дело, что в ТЗ чётко написано ОДНО поле-input:cool:
WHERE first_name + ' ' + last_name LIKE '%$keyword%'
Но, конечно, как уже писалось выше, лучше добавить еще одно поле на форму и объяснить тому кто составлял ТЗ что так будет лучше ибо меньше путаницы
WHERE first_name LIKE '%$keyword%'
and last_name LIKE '%$keyword%'
WHERE first_name + ' ' + last_name LIKE '%$keyword%'
Но, конечно, как уже писалось выше, лучше добавить еще одно поле на форму и объяснить тому кто составлял ТЗ что так будет лучше ибо меньше путаницы
Спасибо, то что нужно!
WHERE first_name LIKE '%$keyword%'
and last_name LIKE '%$keyword%'
А Ваш вариант - не правильный, ибо first_name '%Иванов Василий%' NOT LIKE 'Иванов'.
Я бы использовал вот в такой форме:
WHERE first_name + ' ' + last_name LIKE '%$keyword%'
OR last_name + ' ' + first_name LIKE '%$keyword%'
WHERE first_name + ' ' + last_name LIKE '%$keyword%'
OR last_name + ' ' + first_name LIKE '%$keyword%'
Да да, именно так и сделал. На самом деле в моей таблице три поля - first_name, last_name и e-mail, так что пришлось их перетосовывать в запросе.
З.Ы. хорошо, что не 10:o
Большое спасибо за помощь
А Ваш вариант - не правильный, ибо first_name '%Иванов Василий%' NOT LIKE 'Иванов'.
Если Вы ищете записи с keyword='Иванов', то мой запрос не выведет запись с first_name = 'Иванов' и last_name = 'Василий' :)
И наоборот, при поиске с keyword='Иванов Василий', запрос не выведет запись с first_name = 'Иванов' и last_name = ''
Для приведенного примера мой запрос отработает правильно.
Запрос с OR и слиянием через пробел работать будет хуже:
1) запрос or работает долше;
2) а если между иванов и василий будет 2 пробела или запятая? :)
keyword = '%Иванов Василий%', если first_name = 'Иванов' , last_name = 'Василий'.
Ваш запрос будет искать: first_name = 'Василий Иванов' AND last_name = 'Василий Иванов', что по сути не верно. Только что проверил.
Поправьте меня, если я не прав.
Запрос с OR и слиянием через пробел работать будет хуже:
1) запрос or работает долше;
2) а если между иванов и василий будет 2 пробела или запятая? :)
1) Тут такая система и такая задача что вопрос что дольше или быстрее работает просто неуместен
2) Ничего страшного не будет. Запятую и другие спец символы можно вырезать, а на двойные, тройные и т.д можно поставить простую проверку.
keyword = '%Иванов Василий%', если first_name = 'Иванов' , last_name = 'Василий'.
Ваш запрос будет искать: first_name = 'Василий Иванов' AND last_name = 'Василий Иванов', что по сути не верно. Только что проверил.
Поправьте меня, если я не прав.
Да, Вы правы. Сейчас посмотрел запрос он неверен. :( Хотя имел ввиду такое условие (кроме and надо ещё местами поменять):
where keyword like '%'+first_name+'%'
and keyword like '%'+last_name+'%'
Суть:
пишу бота, надо реагирование на ключевые фразы. В базе они хранятся в виде строки
тест|але?|есть кто?|эй!|там!
Вот желательно одним запросом отловить запись, содержащую одну из ключевых фраз в ответ на вводимую строку, например "здесь есть кто?"
Заранее спасибо.