这是我的第一个帖子。如果这是重复,我道歉,但后来我无法搜索正确的关键字。
我的问题: 网站上有标记的项目。在项目的详细视图上,例如http://localhost/items/a.html我想根据标签显示相似/相关项目的列表。
项目A-标签
项目B标签
项目C标签
表格的结构 :(如here)
表:文章 字段:articleid,title
表:标签 字段:tagid,tagtext
表:articletag 字段:tagid,articleid
当我现在访问项目B的以下入口点(http://localhost/items/b.html)时,我想向用户打印一个列表,该列表按此顺序显示相关项目:
当我在谷歌搜索时,我发现了这样的事情: How to compare two comma-separated string lists using MySQL
它看起来像我的问题,但我没有看到任何提示如何解决我的查询。我发现的大多数其他帖子只会排除项目a和c,因为它们不匹配所有标签(项目a不匹配标签qantitativ和Laktose)
您需要哪些进一步的信息? 顺便说一句:我不会将所有标签作为额外属性添加到items表中,因为能够对此列执行匹配。我不想在标签发生变化时始终更新此标签。这只是db中保存数据大小的两倍。
答案 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
而被忽略。)