高级(可能不是?)MYSQL查询select语句

时间:2014-05-07 04:04:33

标签: mysql sql

请参阅以下示例数据:

'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的计数,并且仅对下一个看到的记录(见> 0)进行计数。所以在上面的例子中,有3个看不见的(看到= 0)记录给用户(用户:2)但其中只有2个我感兴趣,因为下一个1在它之间有一些看到的记录。因此在上面的场景中,将返回2的计数(而不是实际记录)。

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

这是我能解决的问题,但在上面的场景中,这将导致3,而不是2:

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

我希望这是有道理的。

感谢。

1 个答案:

答案 0 :(得分: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而不是null来修复它。