2009-10-31 36 views
2

我之前问过这个问题,得到了一个很好的工作答案。当你已经过滤了从SQL Server获取相关标签

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

,但我意识到,SOF其实需要这一步,因为它支持多标签明细

我的意思是,如果点击该标签C#,将过滤到20000点的问题它会向我展示所有相关标签,这些标签也有C#作为标签。

但后来,我可以点击标签“集合”和现在看到的与标签“C#”和“收藏”的问题总数。也许这500个问题

此外,它仍然会告诉我相关的标签,这是存在于其中也有标签问题标签“C#”和“收藏

,你可以保持滤波下。

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

in sql你如何得到这个工作,能够完全钻取并显示相关标签的数量并允许用户继续选择额外的标签进行深入分析。

回答

4

我会用这样的东西作为第一个版本。 @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 [email protected] AND [email protected] 
    ) 
    AND [email protected] AND [email protected] 
) 

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

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 [email protected] AND [email protected] 
    ) 
    AND [email protected] AND [email protected] 
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 [email protected] AND [email protected] AND [email protected] 
    ) 
    AND [email protected] AND [email protected] AND [email protected] 
GROUP BY t.tagName 
+0

第二查询这里完全适用于2,但我想澄清这将如何为3个工作。我假设我必须为“t1.tagID”行以及“and t.tagid! - ”行添加“and”,但是在哪里放置其他连接。如果你可以澄清3标签的SQL,我应该能够在这里得到的模式 – leora 2009-11-01 04:18:22

+1

更新了答案。 – 2009-11-01 07:13:41

+0

优秀的答案。 。奇迹般有效 – leora 2009-11-02 00:40:20

1

假设你有一个表称为entity_tags连接entitiestags是这样的:

entity_id : INTEGER 
tag_id : INTEGER 

假设您将用户选为N个标签@ 1,@ 2,... @N。要得到的结果(和作为奖金,他们occurence的频率)相关联的其它标签:

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 [email protected]) 
... 
JOIN entity_tags AS etN ON (etN.entity_id=et.entity_id AND [email protected]) 
WHERE et.tag_id NOT IN (@1, @2, ... @N) 
GROUP BY et.tag_id; 
0
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 
) 

)