1
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

如您所见,“访问者”访问“资源”,它们之间的关系将在访问者资源中创建。

给定的“资源”有几个“标签”,具体取决于内容,它们通过 resource_tags 中的关系绑定在一起。

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

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

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

查询应输出:tag1, 3 tag2, 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 吗?

4

3 回答 3

1

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

您基本上是在将自动生成的标签值相加,这将比简单地将出现次数相加给您带来更高的结果。

于 2011-04-21T14:00:57.207 回答
1

看来您的问题可能是因为您正在执行 SUM 而不是 COUNT

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

代替

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

应该这样做。

于 2011-04-21T14:02:25.117 回答
0

利用: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
于 2011-04-21T14:00:29.890 回答