C# 如何实现标签计数
我的数据库中的标签设计如下:C# 如何实现标签计数,c#,sql,asp.net-mvc,linq,tagging,C#,Sql,Asp.net Mvc,Linq,Tagging,我的数据库中的标签设计如下: 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
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
如果我想知道每个标签的计数,比如stackoverflow如何计数他们的标签,我会怎么做?我将执行什么样的查询。我对常规sql和linq都持开放态度您可以使用
项
中的另一列存储标记计数,并在添加或删除标记时将其同步。在表标记中添加另一列作为计数器。当您从项目中添加或删除标记时,您会更新计数器(换句话说,当在Itemtag上添加一行时,会增加标记表上的计数器;当删除时,会减少计数器)
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
SELECT title, count(*) FROM tag
JOIN itemtag ON itemtag.tagid = tag.tagid
GROUP BY title
将标记添加到项目:
INSERT INTO Itemtag (itemid,tagid) VALUES ('$itemid','$tagid');
UPDATE Tag SET counter=counter+1 WHERE tagid='$tagid';
从项目中删除标记
DELETE FROM Itemtag WHERE itemid='$itemid' AND tagid='$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'
桌子的关系是什么?很好!如果我有成千上万的帖子和标签,这会对数据库造成很大影响吗?当每个表的行数超过10行时,指望每个查询都会毁掉数据库Angelbit发布了最好的解决方案。实际上我同意Angelbit的方法更好。。。这与大型分布式数据库(如BigTable)建议处理项目计数报告的方式相同。我只是想写下您要求的查询。:)