MySQL запрос на строки в определенные промежутки времени - PullRequest
2 голосов
/ 04 августа 2010

У меня некоторая путаница с запросом mysql.Любая помощь приветствуется.

Мой текущий запрос:

SELECT
  r.name
, r.network
, i.name
, d.dtime
, d.input
FROM router AS r
INNER JOIN interface AS i
ON r.rid = i.rid
INNER JOIN 1273118400_1_60 AS d
ON i.id = d.id
AND dtime BETWEEN 1273152000 AND 1273153800 WHERE i.status = "active"

Теперь я использую Unix_Timestamp для интервала времени, между которым я запрашиваю.Сейчас я получаю результаты для: 1273152000, 1273152001, 1273152002 и т. Д.

Я хочу получать с интервалом в 60 секунд, например: 1273152000, 1273152060, 1273152120 и т. Д.

Любая идея, как я мог пойти об этом ????

Пожалуйста, помогите.Спасибо,

Джиллика

Ответы [ 3 ]

2 голосов
/ 04 августа 2010

Я не уверен, что это можно еще упростить, но вы можете попробовать следующее:

SELECT       r.name,
             r.network,
             i.name,
             d.dtime,
             d.input
FROM         router AS r
INNER JOIN   interface AS i ON (r.rid = i.rid)
INNER JOIN   (
                 SELECT      t.dtime, dt.input, dt.id
                 FROM        1273118400_1_60 AS t
                 INNER JOIN  (
                                SELECT dtime, id, input
                                FROM   1273118400_1_60
                             ) AS dt ON (dt.dtime = t.dtime AND dt.id = t.id)
                 GROUP BY    t.dtime DIV 60
             ) AS d ON (i.id = d.id)
WHERE        (d.dtime BETWEEN 1273152000 AND 1273153800) AND 
             (i.status = 'active');

Контрольный пример:

CREATE TABLE router (rid int, name varchar(20), network int);
CREATE TABLE interface (id int, rid int, status varchar(20), name varchar(10));
CREATE TABLE 1273118400_1_60 (id int, dtime int, input int);

INSERT INTO router VALUES (1, 'router A', 0);
INSERT INTO interface VALUES (1, 1, 'active', 'interface A');
INSERT INTO 1273118400_1_60 VALUES (1, 1273151999, 1);
INSERT INTO 1273118400_1_60 VALUES (1, 1273152000, 2);
INSERT INTO 1273118400_1_60 VALUES (1, 1273152001, 3);
INSERT INTO 1273118400_1_60 VALUES (1, 1273152002, 4);
INSERT INTO 1273118400_1_60 VALUES (1, 1273152059, 5);
INSERT INTO 1273118400_1_60 VALUES (1, 1273152060, 6);
INSERT INTO 1273118400_1_60 VALUES (1, 1273152061, 7);
INSERT INTO 1273118400_1_60 VALUES (1, 1273152062, 8);
INSERT INTO 1273118400_1_60 VALUES (1, 1273152119, 9);
INSERT INTO 1273118400_1_60 VALUES (1, 1273152120, 10);
INSERT INTO 1273118400_1_60 VALUES (1, 1273152121, 11);

Результат:

+----------+---------+-------------+------------+-------+
| name     | network | name        | dtime      | input |
+----------+---------+-------------+------------+-------+
| router A |       0 | interface A | 1273152000 |     2 |
| router A |       0 | interface A | 1273152060 |     6 |
| router A |       0 | interface A | 1273152120 |    10 |
+----------+---------+-------------+------------+-------+
3 rows in set (0.00 sec)
0 голосов
/ 04 августа 2010
SELECT
r.name
,r.network
,i.name
, d.dtime
, 60*(floor(d.dtime/60)) dtime2
, d.input
FROM router AS r
INNER JOIN interface AS i
ON r.rid = i.rid
INNER JOIN 1273118400_1_60 AS d
ON i.id = d.id
AND dtime BETWEEN 1273152000 AND 1273153800 WHERE i.status = "active"
0 голосов
/ 04 августа 2010

Ваш вопрос не слишком ясен, но попробуйте это в любом случае:

SELECT r.name, r.network, i.name, d.dtime, d.input
FROM router r
INNER JOIN interface i
ON r.rid = i.rid
INNER JOIN 1273118400_1_60 AS d
ON i.id = d.id
WHERE d.time > 1273152000 AND d.time < 1273153800 
AND i.status = "active";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...