【问题标题】:How to implement tag counting如何实现标签计数
【发布时间】:2011-01-08 12:23:12
【问题描述】:

我的数据库中有这样设计的标签:

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 都持开放态度

【问题讨论】:

  • 表的关系是什么?

标签: c# sql asp.net-mvc linq tagging


【解决方案1】:

在表格标签中添加另一列作为计数器。当您从项目中添加或删除标签时,您会更新计数器(换句话说,当在 Itemtag 上添加一行时,增加 Tag 表上的计数器,当删除时减少计数器)

为项目添加标签:

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'

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

    • 不错!如果我有成千上万的帖子和标签,这会对数据库造成困难吗?
    • 当每个表的行数超过 10 行时,每次查询都会杀死您的数据库。 ;) Angelbit 发布了最佳解决方案。
    • 我实际上同意 Angelbit 的方法更好......这与大型分布式数据库(例如 BigTable)建议处理项目计数报告的方式相同。我只是想写你要求的查询。 :)
    【解决方案3】:

    您可以使用Item 中的另一列来存储标签计数并在添加或删除标签时对其进行同步。

    【讨论】:

      【解决方案4】:
      SELECT title, count(*) FROM tag
      JOIN itemtag ON itemtag.tagid = tag.tagid
      GROUP BY title
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 2015-05-11
        相关资源
        最近更新 更多