2009-10-31 34 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 
) 

)