2011-04-21 37 views
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 

正如你可能会看到指向,一个“访客”访问“资源”和它们之间的关系,将visitor_resource创建。计数多少时间的关系以相同的密钥

给定的'资源'根据内容有几个'标签',它们通过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?

回答

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 
+0

啊。我不知道,但这是有道理的!感谢您的建议。 – 2011-04-21 14:18:07

1

您正在对ID做一个SUM,而不是COUNT。

您基本上将自动生成的标记值相加,这会比单纯添加事件的结果要高得多。

+0

* facepalm *谢谢 – 2011-04-21 14:02:43

+0

老兄,这样的错误发生在我们所有人身上。当我完成完全相反的布尔操作时,我已经失去了计数时间:) – 2011-04-21 14:04:19

1

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

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

,而不是

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

应该这样做。