请参阅小提琴:
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小提琴),那么最好只在计数中包含已删除的帖子。
我希望这是有道理的。
答案 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(已删除),那么其日期值必须等于看不见的帖子的最新数据。