SEDE查询仅返回双标签问题的原因及单/双标签查询调整方法
问题原因与修改方案
为什么只返回双标签问题?
你现在的查询通过两次内连接PostTags和Tags,并且用AND同时要求t.TagName和t1.TagName匹配指定标签。这相当于强制要求同一个问题必须同时关联两条标签记录(分别对应两个目标标签),只有同时带两个标签的问题才能满足这个条件,自然只会返回双标签结果。另外你的查询里p.PostId=1是错误的,应该是p.PostTypeId=1——PostTypeId=1才代表这是一个问题帖,PostId是回答关联的问题ID,问题的PostId字段是空的,不改这个的话可能查不到任何有效结果。
修改方法(两种可选)
方法一:单连接+OR匹配+去重
只连接一次标签表,用OR匹配任意一个目标标签,再用DISTINCT避免同一个问题因多个标签被重复返回:
SELECT DISTINCT p.Title, p.Id, p.Score, p.ViewCount, u.DisplayName, p.Tags FROM Posts p JOIN Users u ON p.OwnerUserId = u.Id INNER JOIN PostTags pt ON p.Id = pt.PostId INNER JOIN Tags t ON t.Id = pt.TagId WHERE p.PostTypeId = 1 AND (t.TagName = ##tagName:string?logical-deduction## OR t.TagName = ##tagName:string?grid-deduction##) AND p.Score <= 10 AND p.Score >= 0 AND p.AcceptedAnswerId IS NULL ORDER BY p.Score DESC
方法二:EXISTS子查询(性能更优)
用EXISTS检查问题是否包含任意一个目标标签,不需要去重,逻辑更清晰:
SELECT p.Title, p.Id, p.Score, p.ViewCount, u.DisplayName, p.Tags FROM Posts p JOIN Users u ON p.OwnerUserId = u.Id WHERE p.PostTypeId = 1 AND EXISTS ( SELECT 1 FROM PostTags pt JOIN Tags t ON t.Id = pt.TagId WHERE pt.PostId = p.Id AND (t.TagName = ##tagName:string?logical-deduction## OR t.TagName = ##tagName:string?grid-deduction##) ) AND p.Score <= 10 AND p.Score >= 0 AND p.AcceptedAnswerId IS NULL ORDER BY p.Score DESC
说明
- 两种方法都能返回含其中一个标签或同时含两个标签的问题;
- 方法二的
EXISTS子查询在数据量大时性能更好,因为找到匹配标签后就会停止查询,不会返回多余的标签记录; - 必须把原查询里的
p.PostId=1改成p.PostTypeId=1,否则无法正确筛选问题帖。
内容的提问来源于stack exchange,提问作者CrSb0001
相关产品推荐
相关产品推荐

