2014-05-09 247 views
0

请参阅小提琴:SQL查询语句select statemenet

http://sqlfiddle.com/#!2/de208/1

到目前为止,我有,我想工作正常,但现在我发现一个问题情况下,下面的SQL语句。

SELECT Count(id) FROM data WHERE user = 2 AND seen = 0 
AND date > (SELECT coalesce(MAX(date),0) FROM data WHERE user = 2 AND seen <> 0); 

A部分) 在上面摆弄这个效果很好,它产生计数2 - 最看不见的职位。 问题是最近一次看不见的帖子在被看到之前已被删除,所以它也会被忽略。所以下一次有数据时,这个查询被执行,它将被再次计数。应该只计算一次。

部分B) 因此,通过时间的下一个小提琴(一对夫妇的加入新行)执行结果是3个看不见的职位数,而实际上它应该是2 http://sqlfiddle.com/#!2/1e750b/1

我认为这个问题只会发生,如果最新的未见过的帖子(如A部分小提琴中的记录677)被删除后。因此,这将是很好的仅包括在计数删除的文章,如果他们是最近的看不见的职位(S)和(B部分提琴在创纪录的677)看不见的非删除后前不来。

我希望这是有道理的。

+0

我对你的要求有些困惑。当你说你不想计算已删除的帖子时,我会解释它。如果是这种情况,你可以添加AND删除<> 1到第一个where子句? –

+0

嗨拉兹。不,我们希望统计已删除的帖子,但只能统计一次。作为最有可能看不见的删除帖子(它在被看到之前被删除),它永远不会被看到,因此它可以被计数两次 - 我们不希望发生这种情况。但它确实需要计算一次。 – Martin

+0

它是如何计算两次?有3行比上次看到的帖子更新,结果是3.所以他们每个人只被计算一次。 – Barmar

回答

0

重新计算问题可能发生在查询再次运行时(无论是否被删除)仍未看见的任何帖子,所以我认为您需要跟踪上次查询的运行时间并只计算新的项

SELECT Count(id) FROM data WHERE user = 2 AND seen = 0 
AND date > (SELECT coalesce(MAX(date),0) FROM data WHERE user = 2 AND seen <> 0) 
AND date > last_count_date 

我认为,如果最近看不见的帖子 (如记录677中部分A小提琴)被删除后,只会出现问题。因此,这将是 好于数只包括删帖,如果他们是最 最近看不见的职位(S)和(B部分提琴在创纪录的677)看不见的非删除后 之前没有来。

我不知道这是真的。假设在运行计数查询之间添加以下2行:删除未看见,然后看不见。在这种情况下,删除的未看到的帖子不是最近的帖子,但仍应包括在计数中。

+0

感谢您的时间/输入。我不确定last_count_date来自您的查询。没有这样的领域。约瑟夫B的回答几乎击中了头部,除了在这种情况下:http://sqlfiddle.com/#!2/874f3/1。 – Martin

+0

last_count_date是每次运行查询(初始化为0时)需要存储的新信息,它表示查询以前运行的日期。我不相信有可能避免“重新计算”,因为我的文章中提到的原因,未存储已经计算的信息。 – FuzzyTree

+0

Thanks.I相信只要您根据Joseph B的解决方案计算删除的邮件(这些邮件是最近的记录时),就可以避免重新计数。第二次计数完成后,因为它们正在显示给用户,所以有一个查询标记了以前看不到的(但未删除的)帖子。由于删除的帖子不是显示,所以它们不会发生。这发生在执行此查询之后。因此,任何未删除的现在看不到的帖子会在查询再次执行后被标记为可见。我应该更好地解释它 – Martin

0

是的,你的逻辑

只算在内删除的文章,如果他们是最近 看不见的博文

会很好地工作。我修改了原始查询并添加了一个额外的条件来执行此检查,如下所示。

SELECT Count(id) 
FROM data 
WHERE user = 2 
AND seen = 0 
AND date > (SELECT coalesce(MAX(date),0) FROM data WHERE user = 2 AND seen <> 0) 
AND (deleted = 0 
    OR (date = (SELECT coalesce(MAX(date),0) FROM data WHERE user = 2 AND seen = 0))); 

所以,要么删除必须为0,或者如果它是1(删除),那么它的日期值必须等于看不见帖子的最新的数据。

SQL Fiddle

+0

谢谢,我一直在玩这个,并一直试图理解逻辑,并已得到无处:)我注意到一个问题,当最近的帖子中有1个被标记为删除时,它只计数其中一个并停在那里。例如。这个小提琴应该返回3. 2个最近的帖子被删除,1个稍微老的未看到的未删除的帖子。 – Martin

+0

将查询的OR部分更改为日期<=(SELECT coalesce(MAX(date),0)FROM data WHERE user = 2 AND seen = 0)似乎适用于我非常有限的测试。但没有真正理解它,所以它可能不是解决方案。 – Martin

+0

呃,不是它没有修复,在这个小提琴中只有1个应该返回(因为删除的帖子不是最近看不见的帖子),但是返回2(包括删除的帖子):http://sqlfiddle.com /#!2/874f3/1 – Martin