Как видно из названия, у меня проблема с реализацией алгоритма связанных статей.Позвольте мне начать с перечисления таблиц из базы данных:
[articles]
id_article
id_category
name
content
publish_date
is_deleted
[categories]
id_category
id_parent
name
[tags_to_articles]
id_tag
id_article
[tags]
id_tag
name
[articles_to_authors]
id_article
id_author
[authors]
id_author
name
is_deleted
[related_articles]
id_article_left
id_article_right
related_score
Алгоритм
В любой другой таблице, кроме related_articles, есть данные.Теперь я хочу заполнить related_articles оценками между статьями (очень важно: таблица будет работать как ориентированный график, оценка статьи A со статьей B может отличаться от оценки между B и A, см. Список).Оценка рассчитывается следующим образом:
- , если две рассматриваемые статьи имеют одинаковую категорию, к баллу добавляется число (x)
- для каждого общего автора, которого они имеютчисло (y) добавляется к баллу
- для каждого общего тега, к номеру которого добавляется число (z)
- , если мы вычисляем балл по статье A сВ статье B разница между now () и датой publish_d статьи B сгенерирует число (t), которое будет вычтено из оценки
Мой первый (неэффективный) подход
Я попытался сделать запрос, подобный следующему:
SELECT a.id, b.id, a.id_category, a.publish_date,
b.id_category, b.publish_date,
c.id_tag,
e.id_author
FROM `articles` a, articles b,
tags_to_articles c, tags_to_articles d,
articles_to_authors e, articles_to_authors f
WHERE a.id_article <> b.id_article AND
(
(a.id_article=c.id_article and c.id_tag=d.id_tag and d.id_article=b.id_article)
OR
(a.id=e.id_article and e.id_author=f.id_author and f.id_article=b.id_article)
OR
(a.id_category=b.id_category)
)
Теоретически, это будет перечислять каждый элемент, который стоит вычислить для оценки.Однако это занимает слишком много времени и ресурсов.
Есть ли другой способ?Я также открыт для настройки алгоритма или таблиц, если он получает работоспособное решение.Также стоит отметить, что подсчет баллов выполняется в кроне, конечно, я не ожидаю, что это будет выполняться при каждом запросе страницы.