这是我的第一个线程。如果这是重复的,我深表歉意,但后来我无法搜索正确的关键字。
我的问题: 网站上有标记的项目。在项目的详细视图上,例如 http://localhost/items/a.html 我想根据其标签显示类似/相关项目的列表。
-
物品 A 标签
- 劳动
- 化学
- Analytik
- 梅尔维格
-
物品 B 标签
- 劳动
- 化学
- 定量
- 拉克托斯
-
商品C标签
- 定量
- 阿布谢登
- 弗拉申普凡德
表格的结构:(如此处(
表:文章 字段:文章 ID、标题
表:标签 字段:标记、标记文本
表:文章标签 字段:标记、文章标识
当我现在访问项目 B 的以下入口点 (http://localhost/items/b.html( 时,我想向用户打印一个列表,按以下顺序显示相关项目:
- 项目 A(因为有两个相同的标记(
- 项目 C(因为同一个标签(
当我在谷歌中搜索时,我发现了这样的东西: 如何使用MySQL比较两个逗号分隔的字符串列表
它看起来就像我的问题一样,但我没有看到任何提示如何为我的查询解决这个问题。我找到的大多数其他帖子只会排除项目 a 和 c,因为它们不匹配所有标签(项目 a 与标签 qantitativ 和 Laktose 不匹配(
您需要哪些进一步的信息? 顺便说一句:我不会将所有标签作为额外属性添加到项目表中,因为能够在此列上执行匹配。我只是不想在标签更改时总是更新此标签。这只是将数据库中保存的数据大小增加了一倍。
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
的完整扫描。 因此,请注意我讨论的提示 多:多映射.
如果在执行查询后需要获取有关项目的信息,请将其用作"派生"表;例如:
SELECT articles.*
FROM ( the above SELECT ) AS x
JOIN articles USING(articleid)
ORDER BY x.ct DESC;
(您可以从内部查询中删除ORDER BY
,因为它将被优先忽略,而不是外部ORDER BY
。