尝试在SQL中连续显示多行记录的前几天记录

时间:2014-12-15 16:03:18

标签: mysql sql

我试图在前三天显示我的mysql数据库中的记录,但前提是记录连续多次。所以显示过去三天的所有记录,但前提是这三天内的记录相同

例如,在我的数据库中,我的记录如下所示:

+--------+-------------+------+-----+-------------------+----------------+
| Field  | Type        | Null | Key | Default           | Extra          |
+--------+-------------+------+-----+-------------------+----------------+ 
| id     | int(11)     | NO   | PRI | NULL              | auto_increment |
| ts     | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |
| server | varchar(15) | YES  |     | NULL              |                |
| status | varchar(30) | YES  |     | NULL              |                |
+--------+-------------+------+-----+-------------------+----------------+

所以,我的记录看起来像:

+----+---------------------+------------+----------+
| id | ts                  | server     | status   |
+----+---------------------+------------+----------+
| 1 | 2014-12-13 09:25:41 | test_host1  | new-file |
| 2 | 2014-12-14 09:25:41 | test_host1  | new-file |
| 3 | 2014-12-14 09:25:41 | test_host2  | new-file |
| 4 | 2014-12-15 09:25:41 | test_host1  | new-file |
| 5 | 2014-12-15 09:25:41 | test_host3  | new-file |
+-------+---------------------+----------+---------+
12799 rows in set (0.02 sec)

我写了一个查询,它会显示最近三天,但它会显示所有服务器:

select * from table WHERE ts > CURRENT_DATE - INTERVAL 3 DAY AND DATE(ts) <> DATE(NOW());

我只想要每天只按顺序发生的服务器。所以我的伪代码将是:

select * from table from the last three days where server has a record in all three days

我不想选择服务器只显示其中一天的服务器。

有谁知道如何实现这一目标?我部分在那里,只需要帮助最后一块。

谢谢。

1 个答案:

答案 0 :(得分:2)

使用聚合查找三天内出现的服务器:

select server
from table
where ts > CURRENT_DATE - INTERVAL 3 DAY AND DATE(ts) <> DATE(NOW())
group by server
having count(distinct date(ts)) = 3;

然后加入这些以获取原始记录:

select t.*
from table t join
     (select server
      from table
      where ts > CURRENT_DATE - INTERVAL 3 DAY AND DATE(ts) <> DATE(NOW())
      group by server
      having count(distinct date(ts)) = 3
     ) s
     on t.server = s.server
where ts > CURRENT_DATE - INTERVAL 3 DAY AND DATE(ts) <> DATE(NOW());