2009-10-30 20 views
1

我有3個表:什麼是查詢以獲得「相關標籤」像堆棧溢出

links (id, linkName) 
tags (id, tagName) 
tagsBridge (tagID, linkID) 

我試圖支持顯示像SOF相關的標籤。所以如果你點擊標籤「XYZ」,現在我顯示了標籤「XYZ」的所有鏈接,但是我也想顯示所有其他標籤的人名已標記的項目的標籤「XYZ」

什麼是查詢該

+0

這可能是一個重複的問題。我還沒有完全聲明這一點,但通過搜索與「stackoverflow標籤相關」的關鍵字,你會發現很多現有技術。 – mjv 2009-10-30 05:54:23

回答

3

嘗試:

SELECT t.tagname 
    FROM TAGS t 
    JOIN TAGS_BRIDGE tb ON tb.tagid = t.id 
    JOIN (SELECT li.id 
      FROM LINKS li 
      JOIN TAGS_BRIDGE tb ON tb.linkid = li.id 
      JOIN TAGS t ON t.id = tb.tagid 
      WHERE t.tagname = 'XYZ') x ON x.id = tb.linkid 
GROUP BY t.tagname 
+0

rexem。還有一個問題,如果我選擇了多個標籤,該怎麼辦?所以我想看看相關的標籤,我已經過濾了tagName =「XYZ」和tagname =「ABC」? – leora 2009-10-31 13:19:29

2

一個非常醜陋的嵌套查詢的最快方法

SELECT DISTINCT tagName FROM tags WHERE id in 
(
    SELECT tagID FROM tagsBridge WHERE linkID IN 
    (
     SELECT linkID FROM tagsBridge WHERE tagID IN 
     ( 
      SELECT id FROM tags WHERE tagName like 'XYZ' 
     ) 
    ) 
) 
+4

不要毆打自己,至少你使用正確的縮進使它看上去很漂亮。 – Esko 2009-10-30 06:38:39

+0

這似乎不工作,因爲它總是返回0記錄似乎 – leora 2009-10-31 03:17:32

+0

+1測試了這一點,它的工作原理。它比接受的答案更有效率。 – Andomar 2009-10-31 10:34:59

0

編輯:現在這基本上是隻是用不同的方式寫Ki我認爲是Broadhurst的。我想有些DB可能會在幕後做不同的處理,但我認爲幾乎所有的現代引擎都會以其中兩個具有相同的查詢計劃結束。

select distinct t.tagName 
from tags t 
    join tagsBridge tb on (t.id = tb.tagID) 
    join tagsBridge tbt on (tb.linkID = tbt.linkID) 
    join tags ta on (ta.id = tbt.tagID) 
where ta.tagname = 'XYZ' 
+0

「IN」子句中的「DISTINCT」不是必需的 - 標記名是唯一需要唯一的東西。 – 2009-10-30 15:44:05