【问题标题】:Generating tag cloud count given these 3 tables给定这 3 个表,生成标签云计数
【发布时间】:2009-09-22 03:04:47
【问题描述】:

我有这三个表来存储相册的标签。这是架构

表 1:专辑
专辑_ID
专辑名称

表 2:专辑标签
标记_ID
Tag_Name

表 3:AlbumTagBridge
身份证
标记_ID
专辑_ID

能够得出如下结果集的最有效 SQL 是什么:

标签名称 |计数
标签 1 | 19
标签 2 | 3
标签 3 | 17

【问题讨论】:

    标签: sql tags


    【解决方案1】:
    SELECT dbo.AlbumTags.Tag_Name, 
           COUNT(dbo.AlbumTagBridge.Tag_Id) AS Cnt
    FROM dbo.AlbumTagBridge 
    INNER JOIN dbo.AlbumTags ON dbo.AlbumTagBridge.Tag_Id = dbo.AlbumTags.Tag_ID
    GROUP BY dbo.AlbumTags.Tag_Name
    

    【讨论】:

    • 我假设您不关心相册,而只关心它们的标签计数。
    【解决方案2】:
    Select Tag_Name, COUNT(AlbumTagBridge.ID)
    From AlbumTags
    Join AlbumTagBridge USING(Tag_ID)
    Group By Tag_Name
    

    AlbumTags.Tag_ID, Tag_name 分组可能会便宜一些,具体取决于您的索引和c(特别是如果您的SQL 引擎不是那么聪明;-),但是由于您没有告诉我们有关您的索引或引擎的任何信息,所以这是关于我们能做的最好的事情。

    【讨论】:

    • 现在我根本没有索引。我正在使用 SQL Server 2008
    • 这段代码还假设标签名称是唯一的;也就是说,没有两个标签的 ID 不同但名称相同。我认为这是一个很好的假设,应该通过唯一的约束来强制执行。
    • 运行此查询给我一个错误:“Tag_ID”不是一个可识别的表提示选项。如果它打算作为表值函数或 CHANGETABLE 函数的参数,请确保您的数据库兼容模式设置为 90。
    • 然后尝试Join AlbumTagBridge ON AlbumTagBridge.Tag_ID = AlbumTags.Tag_ID -- 不知道为什么它会反对USING,但它似乎是!-)
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多