在MySQL中具有权重的匹配标记上对项目进行排序

时间:2014-08-07 17:49:15

标签: php mysql tags

我很难在这里找到正确的查询/查询。当您想使用标签查找相关项目时,在MySQL中,您可以使用“常用标签计数”来查找最相似的项目。

说我的架构如下所示:

  • 标签(tag_id,标题)
  • 文章(article_id,some_text)
  • articles_tags(tag_id,article_id)

然后,您可以使用“文章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匹配,但标签的权重。任何人都知道如何做到这一点?

1 个答案:

答案 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)。