IN () пригодится здесь. Есть несколько методов, они различаются по сложности и производительности
Я предполагаю, что у вас есть таблица категорий, и что все, что использует категорию, использует ее по идентификатору категории, например так:
categories
id
name
posts
id
category
name
Эта функция также удаляет ключевые слова, которые соответствуют категории - как вы описали. Это также позволяет вам искать несколько категорий. Это оставляет вашу поисковую реализацию на ваше усмотрение, хотя я не рекомендую использовать LIKE "% keyword%", так как это действительно снижает производительность.
Использовать ключевое слово IN
$keywords = $escaped_keywords = explode(' ', $user_input);
array_walk($escaped_keywords, 'db_escape');
$query = 'SELECT id, name FROM categories WHERE name IN ("' . implode('", "', $escaped_keywords) . ")";
$result = db_query($query);
$category_in = '';
while($row = db_fetch($result)) {
$category_in .= ($category ? ', ' : '') . db_escape($row['id']);
unset($keywords[$row['name']))
}
if($category_in) {
// $where is your conditional from your current script
$where .= ($where ? ' AND ' : '') . "category IN($category_in)";
}
Вместо этого создайте поисковый индекс
Другое решение значительно сложнее, так как требует создания поискового индекса. Поисковый индекс позволит вам вставить названия категорий в часть поискового индекса и пометить их как более релевантные для этого ключевого слова (чем, скажем, в теле сообщения), а также пометить категорию как более релевантную, чем другие ключевые слова. Преимущество этого в том, что у вас есть все виды контроля над тем, что появляется первым: что-то вроде:
SELECT p.*, MAX(pi.relevance) relevance FROM posts LEFT JOIN post_index pi ON pi.post = post.id WHERE keyword IN (keyword_list) GROUP BY pi.post_date, pi.post ORDER BY relevance DESC
Ваш индексатор может делать все что угодно, чтобы определять сортировку или релевантность. Сложнее всего определить, когда нужно индексировать ваш контент.