SQL查询select语句

时间:2014-05-09 01:33:49

标签: mysql sql

请参阅小提琴:

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)中删除后才会发生。因此,如果它们是最近看不见的帖子,并且未出现在未看到的未删除帖子之前(如B部分中的记录677小提琴),那么最好只在计数中包含已删除的帖子。

我希望这是有道理的。

2 个答案:

答案 0 :(得分: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
  

我认为问题只会发生在最近看不见的帖子上   (如A部分小提琴中的记录677)删除后。所以它会   如果它们是最多的,那么只计入包含已删除的帖子   最近看不见的帖子,而不是一个看不见的未删除帖子   (如B部分中的记录677)。

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

答案 1 :(得分: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