Мне сложно найти правильные запросы / запросы здесь. Когда вы хотите найти связанные элементы с помощью тегов, в MySQL вы можете использовать «общий счетчик тегов», чтобы найти наиболее похожие элементы.
Скажем, моя схема выглядит так:
Затем вы можете получать предметы и сортировать их по общим тегам с помощью «статьи 2», например:
SELECT at1.article_id, Count(at1.tag_id) AS common_tag_count FROM articles_tags AS at1 INNER JOIN articles_tags AS at2 ON at1.tag_id = at2.tag_id WHERE at2.article_id = 2 GROUP BY at1.article_id HAVING at1.article_id != 2 ORDER BY common_tag_count DESC;
Но в моей ситуации есть проблема. Я хочу найти похожие статьи, основанные на нескольких статьях, а не на одном (что-то вроде «истории чтения»). И если в двух статьях есть тег X, я хочу, чтобы тег X стал более важным.
Итак, я ищу способ сделать совпадение common_tag_count, но с весом для тегов. Кто-нибудь знает, как это сделать?
Чтобы получить теги, используемые несколькими статьями, в том числе, как часто они используются, вы можете использовать этот запрос:
SELECT tag_id, COUNT(article_id) as tag_weight FROM articles_tags WHERE article_id IN ( /* Read articles */ 1, 2 ) GROUP BY tag_id;
Чтобы получить похожие статьи, основанные на этом выборе, вы должны использовать вышеуказанный запрос в аналогичном объединении, как у вас уже есть:
SELECT articles.article_id, articles.title, SUM(tag_weights.tag_weight) FROM articles JOIN articles_tags ON articles_tags.article_id = articles.article_id JOIN ( SELECT tag_id, COUNT(article_id) as tag_weight FROM articles_tags WHERE article_id IN ( /* Read articles */ 1, 2 ) GROUP BY tag_id ) AS tag_weights ON articles_tags.tag_id = tag_weights.tag_id WHERE articles.article_id NOT IN ( /* Read articles */ 1, 2 ) GROUP BY articles.article_id ORDER BY SUM(tag_weights.tag_weight) DESC;
Мы добавляем дополнительный JOIN здесь, в подзапрос, который имеет доступ к весам тегов. Используя ORDER BY
вы сначала получаете «лучшие» результаты.
Демо: http://www.sqlfiddle.com/#!2/b35432/2/1 (статьи 1 и 2 читаются, давая тегу 1 вес 2, тег 2 – вес 1).