我希望能够帮助构建一个有效的方法来挑选相关的标签
粗略的DB:
CREATE TABLE blog (
blog_id INT,
...
);
CREATE TABLE tag (
blog_id INT
tag VARCHAR(20),
);
CREATE TABLE tag_count (
tag VARCHAR(20),
times INT
);
表'标签'如下所示:
1, 'cat'
1, 'cheeseburger'
2, 'dog'
2, 'cheeseburger'
2, 'ham'
表'tag_count'如下所示:
'cat', 1
'cheeseburger', 2
'dog', 1
'ham', 1
我正在尝试查找条目的相关标签。例如,如果您正在查看博客#2,则相关标记为“cat”,因为两个博客条目共享标记“cheeseburger”。如果您正在查看博客#1,则相关标签为“dog”和“ham”,因为两个条目共享标签“cheeseburger”。
因此,该方法应该找到基于blog_id的相关标签并忽略共享标签(即'cheeseburger')。确定这些相关标签的最有效方法是什么?我包含了tag_count,因为理想情况下我想ORDER BY DESC,以便找到最相关的相关标签。
非常感谢
答案 0 :(得分:0)
您似乎想要的是其他博客上与其他博客共享标签的其他标签。
所以,这表明有些加入和排斥:
select t.tag, count(*)
from (select t2.blog_id as other_blog_id
from tags t join
tags t2
on t.tag = t2.tag and
t.blog_id <> t2.blog_id
where t.blog_id = 2
) o join
tags t
on o.other_blog_id = t.blog_id
where not exists (select 1
from tags tt
where tt.blog_id = 2 and tt.tag_id = t.tag_id
)
group by t.tag;
第一个子查询获取相关的博客ID。外部查询然后将其连接回标签,not exists
排除已经在博客2中的那些。