我很难在这里找到正确的查询/查询。当您想使用标签查找相关项目时,在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匹配,但标签的权重。任何人都知道如何做到这一点?
答案 0 :(得分:1)
要获取多篇文章使用的标记,包括它们的使用频率,您可以使用此查询:
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)。