我试图在前三天显示我的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
我不想选择服务器只显示其中一天的服务器。
有谁知道如何实现这一目标?我部分在那里,只需要帮助最后一块。
谢谢。
答案 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());