Помогите разобрать sql-запрос
Мне нужно при выводе новости по заданным для нее ключевым словам отобрать все похожие новости.
Вот подсказали запрос:
SELECT pid, COUNT(есть_слово) кол_во_слов FROM
(
SELECT pid, 1 FROM Статьи WHERE текст_статьи LIKE '%' + ключевое_слово_1 + '%'
UNION
SELECT pid, 1 FROM Статьи WHERE текст_статьи LIKE '%' + ключевое_слово_2 + '%'
UNION
SELECT pid, 1 FROM Статьи WHERE текст_статьи LIKE '%' + ключевое_слово_3 + '%'
UNION
SELECT pid, 1 FROM Статьи WHERE текст_статьи LIKE '%' + ключевое_слово_4 + '%'
) abc
GROUP BY pid
ORDER BY кол_во_слов DESC
Но что здесь count(есть_слово)? Что такое есть_слово?
Может кто-то подсказать? Или есть другой алгоритм?
Мне нужно при выводе новости по заданным для нее ключевым словам отобрать все похожие новости.
Вот подсказали запрос:
SELECT pid, COUNT(есть_слово) кол_во_слов FROM
(
SELECT pid, 1 FROM Статьи WHERE текст_статьи LIKE '%' + ключевое_слово_1 + '%'
UNION
SELECT pid, 1 FROM Статьи WHERE текст_статьи LIKE '%' + ключевое_слово_2 + '%'
UNION
SELECT pid, 1 FROM Статьи WHERE текст_статьи LIKE '%' + ключевое_слово_3 + '%'
UNION
SELECT pid, 1 FROM Статьи WHERE текст_статьи LIKE '%' + ключевое_слово_4 + '%'
) abc
GROUP BY pid
ORDER BY кол_во_слов DESC
Но что здесь count(есть_слово)? Что такое есть_слово?
Может кто-то подсказать? Или есть другой алгоритм?
SELECT pid, [COLOR="Red"]1 AS есть_слово [/COLOR]
FROM Статьи
WHERE текст_статьи LIKE '%' + ключевое_слово_1 + '%'
Ваш запрос вернет список статей с указанием количества похожих ключевых слов в них, отсортированный в обратном порядке по количеству слов
в виде
ids кл-во_слов
1 5
2 3
...
Вам останется только выбрать, например первые 3 или 10 записей и вывести их.
SELECT sid, COUNT( ex ) count
FROM (
SELECT sid, 1 AS ex
FROM kolumb_stories2
WHERE kews LIKE '%Избыточный%'
UNION SELECT sid, 1 AS ex
FROM kolumb_stories2
WHERE kews LIKE '%вес%'
UNION SELECT sid, 1 AS ex
FROM kolumb_stories2
WHERE kews LIKE '%укорачивает%'
UNION SELECT sid, 1 AS ex
FROM kolumb_stories2
WHERE kews LIKE '%жизнь%'
)abc
GROUP BY sid
ORDER BY count DESC
При выполнении этого запроса результат получаю:
37 1
38 1
40 1
Хотя для записи 37 kews равно "Избыточный вес" и по идее должно быть 2
Что у меня не правильно?
Ну если у тебя не выделенный сервер, а обычный хостинг то готовся к разговорам с тех поддержкой за превышение квоты использования ЦП и оперативы ) Ну а если выделенный то готовся к чтению логов и отловке самых тормозных запросов. Если таких запросов не избежать предусматривай кеширование, ну а если приложение только разрабатываеться то советую полностью пересмотреть структуру БД и приложения в целом, исключить такие медленные запросы. Работа со строками в БД одно из самых тормозных мест в приложении
ЗЫ запрос просто ШИКАРЕН - в нем присутствуют почти все самые тормозные реализации SQL - такие как COUNT() (раз), LIKE да еще и по полнотекстовому поиску (два), GROUP BY (три), ORDER по count (четыре) и отсутсвие каких бы то ни было лимитов (хотя они и не спасут при выборке прогоняющей всю таблицу) а еще унион )