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