计算一个关系指向同一个键的次数


SELECT t.tag_name
FROM tags t
 JOIN resource_tags rt ON rt.tag_id = t.tag_id
 JOIN resource r ON r.resource_id = rt.resource_id
 JOIN visitor_resource vr ON vr.resource_id = rt.resource_id
 JOIN visitor v ON v.visitor_id = vr.visitor_id
WHERE v.visitor_id = '1'
GROUP BY t.tag_name

正如你所看到的,一个'visitor'访问了一个'resource',它们之间的关系将在visitor_resource中创建。

一个给定的"资源"根据内容有几个"标签",它们通过resource_tags中的关系绑定在一起。

上面的查询输出一个访问者访问过的所有资源的标签名。

现在我想知道一个标签被表示了多少次。

考虑以下内容:资源1:tag1, tag2资源2:tag1资源3:tag2资源4:tag1

查询应该输出:标签1、3标签2 2

我试过了:

SELECT t.tag_name, SUM(t.tag_id) as cnt
 FROM tags t
 JOIN resource_tags rt ON rt.tag_id = t.tag_id
 JOIN visitor_resource vr ON vr.resource_id = rt.resource_id
 JOIN visitor v ON v.visitor_id = vr.visitor_id
WHERE v.visitor_id = '2'
GROUP BY t.tag_name

但是对于cnt来说,这似乎是非常不合理的数字,而且不包括这个特定的用户。

这在MySQL中是可能的吗?

您正在对ID进行SUM,而不是COUNT。

你基本上是在把标签的自动生成值加起来,这将给你一个比简单地把出现次数加起来高得多的结果。

看来你的问题可能是因为你在做SUM而不是COUNT

SELECT t.tag_name, COUNT(t.tag_id) as cnt

代替

SELECT t.tag_name, SUM(t.tag_id) as cnt

使用:COUNT(t.tag_id)

而不是SUM(t.tag_id)

按id(主键)分组也更常见,而且可能更快,因为可以使用索引进行分组。tag_name不能有索引。

SELECT t.tag_name
     , COUNT(t.tag_id) AS cnt
FROM tags t
  JOIN resource_tags rt ON rt.tag_id = t.tag_id
  JOIN visitor_resource vr ON vr.resource_id = rt.resource_id
  JOIN visitor v ON v.visitor_id = vr.visitor_id
WHERE v.visitor_id = '2'
GROUP BY t.tag_id

相关内容

  • 没有找到相关文章

最新更新