#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 для выполнения такого рода задач очень эффективно. Это позволит вам ранжировать результаты на основе привязки к ключевым словам.