Поиск «связанных записей» в базе данных

#sql

#sql

Вопрос:

Итак, краткий вопрос: я работаю над добавлением «связанных сообщений» для своего сайта, используя мою собственную CMS, которую я создал. Прямо сейчас я пытаюсь выполнить это в одном SQL-запросе, где он вернет 3 лучших результата. Кстати, я не использую теги. Это то, что я придумал до сих пор, и это дает достойный результат, но я хотел бы каким-то образом расставить приоритеты по ключевым словам, которые появляются в заголовках, а не в описаниях. Кто-нибудь может придумать лучший способ?

 SELECT * FROM db WHERE title LIKE "%keyword1%" OR title LIKE "%keyword2%" OR description LIKE "%keyword1%" OR description LIKE "%keyword2%" LIMIT 3;
  

Ответ №1:

Вы можете сделать это с помощью «case»

 SELECT *, case WHEN title like '%keyword1%' or title like  '%keyword2%' THEN 1
  ELSE 0 END as Priority
 FROM db WHERE title LIKE '%keyword1%' OR title LIKE '%keyword2%' OR description LIKE '%keyword1%' OR description LIKE '%keyword2%' LIMIT 3 Order by Priority desc
  

итак, если заголовок содержит ключевое слово, установленное Priority равным 1, в противном случае установите значение 0, а затем упорядочите его по Priority

Ответ №2:

ОБЪЕДИНЕНИЕ двух внутренних выборок, одной для совпадений ключевых слов и одной для совпадений описания. В каждом из этих внутренних выборок назначьте новый priority столбец со значением 1 для ключевого слова SELECT и 2 для описания SELECT.

Затем из объединенных результатов ВЫБЕРИТЕ 3 лучших ПО ПОРЯДКУ priority .

Я бы привел пример для вашей базы данных / data, за исключением того, что вы не дали большого намека на то, какую базу данных вы используете, или на то, как выглядят ваши данные.

Комментарии:

1. Это SQLite, и каждая запись является сообщением.. с заголовком, описанием и т.д.

Ответ №3:

Если вы хотите расставить приоритеты, вы могли бы присвоить некоторый вес каждому подобному совпадению. Что-то вроде этого:

 SELECT TOP 3 * FROM
(
  SELECT *, 1 'Weight' FROM db WHERE title LIKE '%keyword1' OR title LIKE '%keyword2'
  UNION 
  SELECT *, 2 'Weight' FROM db WHERE description LIKE '%keyword1' OR description LIKE '%keyword2'
)T1
ORDER BY Weight ASC
  

Ответ №4:

Если вы используете Oracle DB, то вы можете использовать запросы Oracle Text для выполнения такого рода задач очень эффективно. Это позволит вам ранжировать результаты на основе привязки к ключевым словам.