2014-12-15 1 views
0

Я пытаюсь отобразить записи из моей базы данных mysql за предыдущие три дня, но только если записи несколько раз подряд. Так показать все записи за последние три дня, но только если они одинаковы в эти три дняПытается отображать записи предыдущих дней с несколькими записями в строке в SQL

Например, в моей базе данных у меня есть записи, которые выглядят следующим образом:

+--------+-------------+------+-----+-------------------+----------------+ 
| 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()); 

Я только хочу, чтобы серверы возникали последовательно каждый день. Так что мой psuedocode будет:

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

Я не хочу, чтобы выбрать серверы, где сервер показывает только для одного из дней.

Кто-нибудь знает, как этого достичь? Я отчасти там, просто нужна помощь с последней частью.

спасибо.

ответ

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()); 
+0

Вот оно! Мне нужно много узнать о SQL, и я учусь. – awojo

Смежные вопросы