【问题标题】:what is the query to get "related tags" like in stack overflow在堆栈溢出中获取“相关标签”的查询是什么
【发布时间】:2009-10-30 05:42:52
【问题描述】:

我有 3 张桌子:

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

我正在尝试支持在 SOF 中显示相关标签。因此,如果您单击标签“XYZ”,现在我正在显示带有标签“XYZ”的所有链接,但我还想显示人们已标记那些也已标记“XYZ”的所有其他标签的不同列表

查询这个的最快方法是什么

【问题讨论】:

  • 这可能是一个重复的问题。我还没有完全断言这一点,但是通过使用“stackoverflow tag related”关键字搜索 SO,你会发现很多现有技术。

标签: sql sql-server tsql tags


【解决方案1】:

试试:

  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

【讨论】:

  • 雷克斯。还有一个问题,如果我选择了多个标签怎么办。所以我想查看相关标签,我已经过滤掉了 tagName ="XYZ" 和 tagname = "ABC" ??
【解决方案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'
        )
    )
)

【讨论】:

  • 不要打败自己,至少你通过使用适当的缩进让它看起来漂亮。
  • 这似乎不起作用,因为它似乎总是返回 0 条记录
  • +1 对此进行了测试,它可以工作。它也比公认的答案更有效。
【解决方案3】:

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

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'

【讨论】:

  • IN 子句中的 DISTINCT 不是必需的 - 标记名是唯一需要唯一的东西。
猜你喜欢
  • 2010-11-09
  • 1970-01-01
  • 2010-09-11
  • 2012-05-10
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2011-05-30
相关资源
最近更新 更多