2010-01-23 73 views
7

我有我的標籤我的數據庫desinged這樣的:如何實現標籤計數

Table: Item 
Columns: ItemID, Title, Content 

Table: Tag 
Columns: TagID, Title 

Table: ItemTag 
Columns: ItemID, TagID 



//example -- this is the right sidebar of stackoverflow 
c# × 59279 
sql × 14885 
asp.net-mvc × 9123 
linq × 4337 
tags × 339 

,如果我想知道每個標籤的數量,如計算器如何計算自己的標籤我將如何做呢?我會執行什麼樣的查詢。我打開這兩個常規的SQL和LINQ

+0

什麼是日表格的關係? – 2010-01-23 08:33:58

回答

4

在表中添加另一列作爲計數器的標籤。當您添加或刪除的項更新計數器標籤(換句話說,當加上Itemtag連續遞增的變量表櫃檯,取出遞減,當計數器)

添加標籤項:

從項目

DELETE FROM Itemtag WHERE itemid='$itemid' AND tagid='$tagid'; 
UPDATE Tag SET counter=counter-1 WHERE tagid='$tagid'; 

INSERT INTO Itemtag (itemid,tagid) VALUES ('$itemid','$tagid'); 
UPDATE Tag SET counter=counter+1 WHERE tagid='$tagid'; 

刪除標籤檢索與計數器項標籤

SELECT t.title, t.counter FROM Itemtag AS it JOIN Tag AS t ON t.idtag=it.tagid 
WHERE it.itemid='$itemid' 
+0

感謝天使位 – Luke101 2010-02-05 18:33:42

3
select t.Title, count(it.TagID) as TagCount 
from Tag t 
    inner join ItemTag it on t.TagID = it.TagID 
    inner join Item i on it.ItemID = i.ItemID 
where i.ItemID = @currentItemID -- optional, if you only want current page 
group by t.Title 
+1

不錯!如果我有成千上萬的帖子和標籤,這會對數據庫造成嚴重影響嗎? – Luke101 2010-01-23 09:01:33

+0

對每個查詢進行計數時,如果每個表的行數超過10行,則會終止數據庫。 ;)Angelbit發佈了最佳解決方案。 – Crozin 2010-01-23 11:34:11

+0

我確實同意Angelbit的方法更好......這與大規模分佈式數據庫(例如BigTable)建議處理物品計數報告的方式是一樣的。我只是想寫你所要求的查詢。 :) – 2010-01-24 07:51:47

0

您可以使用另一列Item存儲標籤數量和進行同步時添加或刪除標記。

0
SELECT title, count(*) FROM tag 
JOIN itemtag ON itemtag.tagid = tag.tagid 
GROUP BY title