Различные решения "LIKE '%keyword%'
" не имеют хорошей производительности. Я предлагаю вам использовать FULLTEXT INDEX вместо этого (при условии, что ваша таблица использует механизм хранения MyISAM).
CREATE FULLTEXT INDEX jobsearch_idx ON my_jobs_table (job_title, job_description, location);
Затем вы можете искать, используя оператор MATCH()
:
SELECT * FROM my_jobs_table
WHERE MATCH(job_title, job_description, location) AGAINST( ? );
Замените указанные пользователем ключевые слова, где у меня есть "?
" выше. Кстати, я предполагаю, что разумный дизайн позволил бы найти ключевые слова местоположения, если они встречаются в заголовке или описании. Поэтому в вашем приложении объедините ключевые слова с выбором местоположения (через пробел) и используйте его для параметра запроса.
Я специально исключил category
из этого примера, потому что я предполагаю, что вы хотите, чтобы имена категорий точно совпадали. Поэтому добавьте его с помощью оператора AND
, например:
SELECT * FROM my_jobs_table
WHERE category = ?
AND MATCH(job_title, job_description, location) AGAINST( ? );
Замените два пользовательских варианта (категорию и ключевые слова) на два заполнителя "?
", указанных выше. Используйте параметры запроса, а не переменную интерполяцию.
Конечно, существует множество других опций для полнотекстовых индексов MySQL. Вы можете использовать модификатор поиска "IN BOOLEAN MODE
", например. Я не буду описывать их полностью здесь, вы должны прочитать разделы руководства, чтобы узнать больше об этом.
Справочное руководство по MySQL 5.1: функции полнотекстового поиска .
Что касается обработки случаев, когда пользователи оставляют поля формы пустыми, это другая проблема, отдельная от поиска в базе данных. Вы должны решить эту проблему в Javascript или в коде приложения, либо установив значение по умолчанию, если пользователь не дает его, либо вернув их в форму и сообщив, что они не могут продолжить работу, не указав значение для обязательных полей.