【问题标题】:Getting related tags from SQL Server when you have filtered down过滤后从 SQL Server 获取相关标签
【发布时间】:2009-11-01 20:55:29
【问题描述】:

我之前问过这个问题并得到了很好的答案。

what is the query to get "related tags" like in stack overflow

但我意识到 SOF 实际上更进一步,因为它支持多标签向下钻取

我的意思是,如果点击标签 C#,它会过滤到 20,000 个问题,它会显示所有与 C# 相关的问题的标签一个标签。

然后,我可以点击“Collections”标签,现在可以看到带有“C#”标签和“Collections”标签的问题总数强>”。也许那 500 个问题

此外,它还会显示相关标签,这些标签存在于问题中,也有标签“C#”和“Collections

你可以继续过滤。

所以上面链接中的答案,只支持1个单标签。

在 sql 中,您将如何使其能够完全向下钻取并显示相关标签的数量,并允许用户继续选择其他标签进行向下钻取。

【问题讨论】:

    标签: sql-server database-design tags


    【解决方案1】:

    我会使用这样的东西作为第一个版本。 @FirstTagID@SecondTagID 必须按 ID 排序。您可以通过向内部查询添加更多连接来查询更多标签。

    SELECT tagName
    FROM tags
    WHERE id IN (
        SELECT tagID
        FROM tagsBridge
        WHERE linkID IN (
            SELECT t1.linkID
            FROM
                tagsBridge t1
                JOIN tagsBridge t2 ON t2.linkID=t1.linkID AND t2.tagID > t1.tagID
            WHERE t1.tagID=@FirstTagID AND t2.tagID=@SecondTagID
        )
        AND tagID!=@FirstTagID AND tagID!=@SecondTagID
    )
    

    或者如果你想包含链接的数量:

    SELECT t.tagName, count(*)
    FROM 
        tags t
        JOIN tagsBridge tb ON tb.tagID = t.id
    WHERE
        tb.linkID IN (
            SELECT t1.linkID
            FROM
                tagsBridge t1
                JOIN tagsBridge t2 ON t2.linkID=t1.linkID AND t2.tagID > t1.tagID
            WHERE t1.tagID=@FirstTagID AND t2.tagID=@SecondTagID
        )
        AND t.tagID!=@FirstTagID AND t.tagID!=@SecondTagID
    GROUP BY t.tagName
    

    三个标签相同:

    SELECT t.tagName, count(*)
    FROM 
        tags t
        JOIN tagsBridge tb ON tb.tagID = t.id
    WHERE
        tb.linkID IN (
            SELECT t1.linkID
            FROM
                tagsBridge t1
                JOIN tagsBridge t2 ON t2.linkID=t1.linkID AND t2.tagID > t1.tagID
                JOIN tagsBridge t3 ON t3.linkID=t2.linkID AND t3.tagID > t2.tagID
            WHERE t1.tagID=@FirstTagID AND t2.tagID=@SecondTagID AND t3.tagID=@ThirdTagID
        )
        AND t.tagID!=@FirstTagID AND t.tagID!=@SecondTagID AND t.tagID!=@ThirdTagID
    GROUP BY t.tagName
    

    【讨论】:

    • 这里的第二个查询非常适用于 2,但我想澄清这将如何适用于 3。我假设我必须为 where t1.tagID 行以及“and”添加“and” t.tagid!-" 行,但我在哪里放置其他连接。如果你能澄清 3 个标签的 sql,我应该可以在这里得到模式
    【解决方案2】:

    假设您有一个名为entity_tags 的表将entitiestags 链接起来,如下所示:

    entity_id : INTEGER
    tag_id    : INTEGER
    

    假设您作为选定的 N 个标签 @1、@2、...@N 的用户。要获取与结果相关的其他标签(以及作为奖励,它们的出现频率):

    SELECT et.tag_id, COUNT(et.entity_id) as frequency FROM
     entity_tags AS et
     JOIN entity_tags AS et1 ON (et1.entity_id=et.entity_id AND et1.tag_id=@1)
     ...
     JOIN entity_tags AS etN ON (etN.entity_id=et.entity_id AND etN.tag_id=@N)
    WHERE et.tag_id NOT IN (@1, @2, ... @N)
    GROUP BY et.tag_id;
    

    【讨论】:

      【解决方案3】:
       SELECT t.tagName
       FROM tags t INNER JOIN tagsBridge tb on t.id=tb.tagID
      
       where tb.linkID in (
      
         select tb.linkID from tagsBridge tb
         where tb.tagID= @first_tag
      
         intersect
      
         select tb.linkID from tagsBridge tb
         where tb.tagID= @second_tag
      
         intersect
      
         select tb.linkID from tagsBridge tb
         where tb.tagID= @third_tag
      
         intersect
      
         select tb.linkID from tagsBridge tb
         where tb.tagID= @fourth_tag
      
         --- // you can continue
       )
      
      )
      

      【讨论】:

        猜你喜欢
        • 2011-05-07
        • 2014-05-02
        • 1970-01-01
        • 1970-01-01
        • 2013-05-08
        • 2018-08-19
        • 2017-11-06
        • 1970-01-01
        相关资源
        最近更新 更多