2014-05-07 25 views
0

请参见下面的示例数据:高级(?可能不是)MySQL查询select语句

'messages' table data: 
id, date, user, seen 
674, 1399430687, 2, 0 
675, 1399430957, 2, 1399431766 
676, 1399431065, 1, 1399431766 
677, 1399431723, 2, 1399431766 
678, 1399434322, 2, 0 
679, 1399434330, 2, 0 

我想做的事情只看到最近的非计数(看到= 0)记录到一个特定的用户(用户:2)UP和ONLY直到下一个看到的记录(看过> 0)。所以在上面的例子中,有3个看不见(看过= 0)的记录给用户(用户:2),但其中只有2个我感兴趣,因为下一个记录中间有一些记录。所以在上面的场景中,计数2会被返回(不是实际的记录)。

此外,如果看到用户(用户:2)的最新记录(看到> 0),则应返回0的计数。我只是无法理解如何在mysql中执行此操作,或者如何真正描述它。

这是所有我可以工作,但在上述情况下,这将导致3,而不是2:

SELECT COUNT(*) 
FROM `messages` 
WHERE seen = 0 
AND user = 2 
ORDER BY DATE DESC 

我希望这是有道理的。

谢谢。

+0

您需要意识到的第一件事是数据库中的数据不是以任何特定方式“排序”的。当你选择'WHERE seen = 0'时,其他'看到'的数据根本不会被检索到。 – serakfalcon

+0

非常真实,好点。 – Martin

回答

1

您需要找到最新的非零数据,然后过滤。

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

here's the fiddle

编辑: 上面的代码将不会返回正确的答案,如果用户还没有看到任何记录尚未可言,这段代码通过返回0,而不是空的修复它。

+0

大声笑,之前见过jsfiddle,感谢介绍我到sqlfiddle.com - 之前没有听说过它。 也很多谢谢,这与我有限的测试工作魅力。你能解释一下(如果你有时间的话)“日期>”部分。我明白为什么要使用子查询,但不能将它与“日期”一起使用。 – Martin

+0

从子查询返回的值是已查看的最大日期值。因此,我们按日期使用该值过滤器,只返回任何日期大于该日期但尚未显示的记录。 – serakfalcon

+0

我想,为了帮助您进一步理解,我们使用查询结果作为变量来过滤日期。为了使它起作用,查询需要返回一个值(例如,在考虑它之后,如果用户还没有看到任何消息,查询将不起作用,因为子查询将返回空值) – serakfalcon