使用MySQL和约束搜索匹配的标签(相似性搜索)

时间:2018-06-01 09:39:48

标签: php mysql innodb

这是我的第一个帖子。如果这是重复,我道歉,但后来我无法搜索正确的关键字。

我的问题: 网站上有标记的项目。在项目的详细视图上,例如http://localhost/items/a.html我想根据标签显示相似/相关项目的列表。

  • 项目A-标签

    • 劳动
    • 化学
    • Analytik的
    • Mehrweg
  • 项目B标签

    • 劳动
    • 化学
    • quantitativ
    • Laktose
  • 项目C标签

    • quantitativ
    • abscheiden
    • Flaschenpfand

表格的结构 :(如here

表:文章 字段:articleid,title

表:标签 字段:tagid,tagtext

表:articletag 字段:tagid,articleid

当我现在访问项目B的以下入口点(http://localhost/items/b.html)时,我想向用户打印一个列表,该列表按此顺序显示相关项目:

  • 项目A(因为两个相同的标签)
  • 项目C(因为同一个标签)

当我在谷歌搜索时,我发现了这样的事情: How to compare two comma-separated string lists using MySQL

它看起来像我的问题,但我没有看到任何提示如何解决我的查询。我发现的大多数其他帖子只会排除项目a和c,因为它们不匹配所有标签(项目a不匹配标签qantitativ和Laktose)

您需要哪些进一步的信息? 顺便说一句:我不会将所有标签作为额外属性添加到items表中,因为能够对此列执行匹配。我不想在标签发生变化时始终更新此标签。这只是db中保存数据大小的两倍。

1 个答案:

答案 0 :(得分:0)

SELECT  c.articleid, COUNT(*) AS ct
    FROM articletag AS b
    JOIN articletag AS c  ON c.tagid = b.tagid
                         AND c.articleid != b.articleid
    WHERE b.articleid = 123
    GROUP BY c.articleid
    ORDER BY ct DESC;

在搜索“类似”的内容时到123(你的例子中的项目B), 输出应该

Item-A, 2
Item-C, 1

这是articletag的完整扫描。所以,在我对many:many mapping的讨论中听取了提示。

如果您需要在执行查询后获取有关文章的信息,请将其用作“衍生”文章。表;例如:

SELECT articles.*
    FROM ( the above SELECT ) AS x
    JOIN articles USING(articleid)
    ORDER BY x.ct DESC;

(您可以从内部查询中删除ORDER BY,因为它将优先于外部ORDER BY而被忽略。)