在mysql中计算匹配

时间:2013-07-01 18:04:29

标签: mysql count tags match

我需要创建一个查询,以匹配表tag_id中匹配tags_blogs的博客。还有另一个表包含我在此阶段并不关心的实际标签。

如何获取此表格内容:

reference_id    tag_id  blog_id
1               1       1   
2               2       1   
3               10      6   
4               11      6   
5               10      7   
6               11      7
7               11      8   

并将其返回到(例如)blog_id = 6

blog_id  total_matches
7           2
8           1

换句话说,返回任何博客的id,它们与提供的参数匹配tag_id,以及实现了多少匹配的计数。

这是我到目前为止的代码(到目前为止我离开了):

SELECT blog_id FROM tags_blogs WHERE blog_id = 6

2 个答案:

答案 0 :(得分:2)

您需要一个子查询来选择所有6个(或任何博客ID)标签,如果博客在该子查询中有标签ID,则将其选中,然后将相同的blog_ids组合在一起并计算它们。

SELECT 
     a.blog_id,
     count(*) as total_matches
FROM 
     tags_blogs as a
WHERE 
     a.tag_id IN
     ( SELECT tag_id FROM tags_blogs WHERE b.blog_id=6 ) AND
     a.blog_id!=6 
GROUP BY a.blog_id

将返回

之类的结果
blog_id   total_matches
7         2
8         2 

答案 1 :(得分:1)

根据您的评论,这里更像您正在寻找的内容。请注意,此特定查询不一定是最佳的

select tb.blog_id, count(*) 
  as total_matches 
  from tags_blogs tb
  where tag_id in (select distinct tag_id from tags_blogs where blog_id = 6)
    and blog_id != 6
  group by blog_id

Link to SQL Fiddle

您可能会发现在某些情况下这会更有效,或者更容易创建:

select tb.blog_id, count(*) 
  as total_matches 
  from tags_blogs tb
    join tags_blogs tb1 on tb1.tag_id = tb.tag_id and tb1.blog_id != tb.blog_id
    where tb1.blog_id = 6
  group by tb.blog_id;