查询确定相关标签

时间:2016-12-08 15:39:50

标签: mysql sql

我希望能够帮助构建一个有效的方法来挑选相关的标签

粗略的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,以便找到最相关的相关标签。

非常感谢

1 个答案:

答案 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中的那些。