为何SEDE查询返回Code Golf问题与答案?如何仅筛选符合Jo King赏金的问题?
SEDE查询问题解答
为什么查询会返回重复结果(看似包含答案)?
你的PostTypeId = 1已经限定只查询问题,但结果出现多条相同问题的记录,是因为问题关联了多个标签,通过INNER JOIN PostTags和INNER JOIN Tags后,每个标签会对应生成一条记录,同一个问题有N个标签就会返回N次,并非包含答案。
而标签过滤失效的原因:
- 用
p.Tags LIKE '%tips%'的模糊匹配,可能因标签存储格式(比如带尖括号<tips>)导致匹配不准确; - 用
t.TagName直接过滤时,只要问题有一个非禁用标签,就会保留该标签对应的关联记录,导致带禁用标签的问题也被错误返回。
修正后的SEDE查询语句
SELECT DISTINCT p.Id AS [Post Link], u.DisplayName, p.Score, p.ViewCount, p.Tags FROM Posts p JOIN Users u ON p.OwnerUserId = u.Id WHERE p.PostTypeId = 1 AND p.Score >= 15 AND p.AcceptedAnswerId IS NULL AND NOT EXISTS ( SELECT 1 FROM PostTags pt JOIN Tags t ON pt.TagId = t.Id WHERE pt.PostId = p.Id AND t.TagName IN ('tips', 'king-of-the-hill', 'cops-and-robbers') ) ORDER BY p.Score DESC
关键修改说明
- 添加
DISTINCT:去除因多标签关联产生的重复问题记录,确保每个问题只显示一次; - 改用
NOT EXISTS子查询:精准校验问题是否包含任何禁用标签,只要存在一个就排除该问题,彻底解决标签过滤不彻底的问题; - 移除主查询中不必要的标签表关联:通过子查询完成标签检查,简化逻辑同时避免重复记录生成。
内容的提问来源于stack exchange,提问作者CrSb0001
相关产品推荐
相关产品推荐

