什么是获取“相关标签”的查询,如堆栈溢出

时间:2009-10-30 05:42:53

标签: sql sql-server tsql tags

我有3张桌子:

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

我正在尝试支持在SOF中显示相关标签。因此,如果您点击标签“XYZ”,现在我显示标签“XYZ”的所有链接,但我还想显示人们标记了那些标记为“”XYZ“的项目的所有其他标签的清晰列表

查询此

的最快方法是什么

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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'
        )
    )
)

答案 2 :(得分:0)

编辑:现在这基本上只是一种写作Kirk Broadhurst的方式,我想。我猜有些数据库可能会在幕后以不同方式处理它,但我认为几乎所有现代引擎最终都会有两个具有相同查询计划的引擎。

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'