我有3个表:
links (id, linkName)
tags (id, tagName)
tagsBridge (tagID, linkID)
我试图支持显示像SOF相关的标签。 所以,如果你点击标签“XYZ”,现在我展示所有标签“XYZ”的链接,但我也想表明,人们已标记也已标记的项目”,‘XYZ’的所有其它标签的不同列表
什么是查询最快的方式
我有3个表:
links (id, linkName)
tags (id, tagName)
tagsBridge (tagID, linkID)
我试图支持显示像SOF相关的标签。 所以,如果你点击标签“XYZ”,现在我展示所有标签“XYZ”的链接,但我也想表明,人们已标记也已标记的项目”,‘XYZ’的所有其它标签的不同列表
什么是查询最快的方式
尝试:
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
一个非常丑陋的嵌套查询。
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'
)
)
)
编辑:现在这基本上是写柯克布罗德赫斯特的只是以不同的方式,我想。 我猜有些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'