这篇文章的序言部分,我将在这里解释一下“背景故事”。Stack网站Gaming.SE,也被称为Arqade,对于流行的视频游戏“我的世界”,经常会有很多不好的问题。这些问题中有很多是很容易在搜索引擎上找到的,非常不清楚,以前有人问过,把Arqade当作论坛对待,或者要求用户支持,只有游戏的生产商才能提供。有几个例子可以包括:
查询本质上是以如下方式进行搜索:
%minecraft%或%minecraft-%%的标记查找问题。我想知道以下几点:
下面是代码和查询链接:
SELECT
Id AS [Post Link]
, OwnerUserId AS [User Link]
, Score
FROM Posts WHERE
DeletionDate IS NULL
AND Score <= -1
AND (
Tags LIKE '%minecraft-%%'
OR Tags LIKE '%minecraft%'
)
AND (
ClosedDate IS NULL
OR ClosedDate IS NOT NULL
);
SELECT
COUNT(*)
FROM Posts WHERE
DeletionDate IS NULL
AND Score <= -1
AND (
Tags LIKE '%minecraft-%%'
OR Tags LIKE '%minecraft%'
)
AND (
ClosedDate IS NULL
OR ClosedDate IS NOT NULL
);发布于 2015-10-13 00:46:56
在Post上使用标记字段是查询的一个糟糕的选择。它依赖于表格扫描,这是缓慢的,因为它必须检查每一个问题。注意,您可以使用<和>字符来识别标签列中的开始值和结束值,但是,正如我所说的,不要使用该列。
相反,您应该使用PostTags和Tags表进行连接。使用CTE简化查询是有意义的。
我真的不喜欢SQL的大写风格,但意识到没有标准。如果你能改变标准,请用小写表示关键词.它使列名和表名更易于查看(而这些是重要的部分)。不过,如果你的大写是一致的,你就会得到+1。持之以恒是很重要的,你做到了。
注意,Posts表没有已删除的帖子,也没有删除的帖子。根本没有必要检查DeletedDate。
因此,将标签加入到PostTags中,你就可以得到有“我的世界”标签的帖子。加入到帖子中,你就可以测试分数和闭包了。
以下是未封闭的,得分低的,与我有关的帖子。:
WITH mctags AS (
SELECT Id AS tid
FROM Tags
WHERE TagName LIKE 'minecraft%'
), mcqs AS (
SELECT DISTINCT PostId
FROM PostTags INNER JOIN mctags ON TagId = tid
)
SELECT
Id AS [Post Link],
OwnerUserId AS [User Link],
Tags,
Score
FROM Posts
INNER JOIN mcqs ON Id = PostId
WHERE Score <= -1
AND ClosedDate IS NULL
AND PostTypeId = 1注意,我试着继续使用你的大写关键词.不顾我自己;-)
嗯,一些笔记:
<和<=是有区别的。PostHistory表。发布于 2015-10-13 00:16:34
这根本没什么用。
ClosedDate为空或ClosedDate为非空
说“何去何从”导致的结果和根本不包括声明是一样的。要么你没有得到正确的结果,要么这个可以被删除。
https://codereview.stackexchange.com/questions/107324
复制相似问题