2011-04-21 76 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 

應該這樣做。