2016-05-16 2 views
-4

Я пытаюсь создать динамическую диаграмму с устойчивой временной шкалой, поэтому мне нужно добавить дополнительное время (минуты) к оси x. Мне нужно 2 колонки. Столбец 1 (время) показывает каждую минуту дня из таблицы, которая просто содержит список столбцов времени с 00:00 до 23:59 (таблица с примерами имеет только 20 минут). Я пытаюсь присоединиться к этому с результатами таблицы «журнал». Запрос будет фильтровать имя машины «Я», например «Имя машины» «1». Затем перечислите, когда эта машина изменила состояние рядом с 1440 минутами из таблицы «TimeMins». Надеюсь, это поможет? В конечном счете, у меня есть динамическая диаграмма, которая показывает изменения состояния для машины в течение всего дня. Столбец «время» установит ось x для графика, дающего устойчивую временную шкалуВремя влево Присоединиться - MYSQL

К сожалению, я не могу заставить его правильно подключиться. Может быть, есть другой способ или может кто-то взломать проблему, пожалуйста?

Результат должен быть похож на ...

time  state 
00:00  null (or zero) 
00:01  null 
00:02  1 
00:03  null 
00:04  null 
00:05  0 
00:06  null 
00:07  1 

и т.д. значение для каждой минуты в день, был ли результат в «войти» в эту минуту или нет.

Очень ценный. Были на этом более 2 дней.

Вот SQLfiddle:

http://sqlfiddle.com/#!9/5f91a0/2

Спасибо. Jamie.

+0

Я отредактировал, но страница не обновила, как я ее написал. 2 столбца. «Время» и «Состояние». Благодарю. –

+0

Клубника, пожалуйста, просмотрите мои добавленные комментарии ниже. Ваша помощь будет очень благодарна. –

+0

Достаточно честный. Изменили его, спасибо. –

ответ

0

Вы можете использовать внутренний выбор.

В примере ниже я использую 3.

select name, beginning, ending - beginning as seconds from (
    select a.name, a.ts as beginning, (
    select min(b.ts) 
    from log b 
    where b.ts > a.ts and a.name = b.name and b.state = 0 
) as ending 
    from log a 
    where a.state = 1 
) c 
order by beginning; 

второй является обеспечение начала и окончания для каждой машины

1-й оборачивает 2-й, и это просто расчет секунд для каждого прогона и сортировка результата на старте

3-й пытается найти следующую строку, когда машина останавливается после того, как a.ts начала и состояние 0 с тем же именем (чтобы соответствовать той же машине)

select min(b.ts) 
    from log b 
    where b.ts > a.ts and a.name = b.name and b.state = 0 

http://sqlfiddle.com/#!9/5f91a0/14

+0

Спасибо, Ричард, но это не совсем то, что я ищу. Мое плохое объяснение. Мне нужно 2 столбца.Столбец 1 (время) показывает каждую минуту дня из таблицы, которая просто содержит список столбцов с 00:00 до 23:59. Я пытаюсь присоединиться к этому с результатами таблицы «журнал». Запрос будет фильтровать имя машины, на которое я смотрю, например «1». Затем перечислите, когда эта машина изменила состояние рядом с 1440 минутами из таблицы «TimeMins». Надеюсь, это поможет? –

+0

В конечном счете, у меня есть динамическая диаграмма, которая показывает изменения состояния для машины в течение всего дня. Столбец «время» задает ось x для графика, дающего устойчивую временную шкалу. –

0

Я не защищаю это как решение (и даже с помощью этого метода, есть, безусловно, более оптимальные способы написания этого запроса), но только в качестве иллюстрации ...

DROP TABLE IF EXISTS `log`; 
CREATE TABLE `log` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(16) DEFAULT NULL, 
    `ts` datetime NOT NULL, 
    `state` tinyint(1) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
); 

INSERT INTO `log` VALUES 
(20,1,'2016-05-16 00:03:02',1), 
(21,1,'2016-05-16 00:04:03',0), 
(22,2,'2016-05-16 00:04:28',1), 
(23,2,'2016-05-16 00:06:45',0), 
(25,1,'2016-05-16 00:14:50',1), 
(26,2,'2016-05-16 00:15:35',1); 

DROP TABLE IF EXISTS `TimeMins`; 

CREATE TABLE `TimeMins` (
t time PRIMARY KEY 
); 

INSERT INTO `TimeMins` VALUES 
('00:00:00'), 
('00:01:00'), 
('00:02:00'), 
('00:03:00'), 
('00:04:00'), 
('00:05:00'), 
('00:06:00'), 
('00:07:00'), 
('00:08:00'), 
('00:09:00'), 
('00:10:00'), 
('00:11:00'), 
('00:12:00'), 
('00:13:00'), 
('00:14:00'), 
('00:15:00'), 
('00:16:00'), 
('00:17:00'), 
('00:18:00'), 
('00:19:00'), 
('00:20:00'); 

SELECT a.* 
    , b.id 
    , b.name 
    , b.state 
    FROM 
    (SELECT DISTINCT CONCAT(DATE(l.ts),' ',t.t) i 
        FROM log l 
        , timemins t 
    ) a 
    LEFT 
    JOIN log b 
    ON DATE_FORMAT(b.ts,'%Y%m%d%h%i') = DATE_FORMAT(a.i,'%Y%m%d%h%i'); 
+---------------------+------+------+-------+ 
| i     | id | name | state | 
+---------------------+------+------+-------+ 
| 2016-05-16 00:00:00 | NULL | NULL | NULL | 
| 2016-05-16 00:01:00 | NULL | NULL | NULL | 
| 2016-05-16 00:02:00 | NULL | NULL | NULL | 
| 2016-05-16 00:03:00 | 20 | 1 |  1 | 
| 2016-05-16 00:04:00 | 21 | 1 |  0 | 
| 2016-05-16 00:04:00 | 22 | 2 |  1 | 
| 2016-05-16 00:05:00 | NULL | NULL | NULL | 
| 2016-05-16 00:06:00 | 23 | 2 |  0 | 
| 2016-05-16 00:07:00 | NULL | NULL | NULL | 
| 2016-05-16 00:08:00 | NULL | NULL | NULL | 
| 2016-05-16 00:09:00 | NULL | NULL | NULL | 
| 2016-05-16 00:10:00 | NULL | NULL | NULL | 
| 2016-05-16 00:11:00 | NULL | NULL | NULL | 
| 2016-05-16 00:12:00 | NULL | NULL | NULL | 
| 2016-05-16 00:13:00 | NULL | NULL | NULL | 
| 2016-05-16 00:14:00 | 25 | 1 |  1 | 
| 2016-05-16 00:15:00 | 26 | 2 |  1 | 
| 2016-05-16 00:16:00 | NULL | NULL | NULL | 
| 2016-05-16 00:17:00 | NULL | NULL | NULL | 
| 2016-05-16 00:18:00 | NULL | NULL | NULL | 
| 2016-05-16 00:19:00 | NULL | NULL | NULL | 
| 2016-05-16 00:20:00 | NULL | NULL | NULL | 
+---------------------+------+------+-------+ 
+0

Спасибо Strawberry, но ваше решение, похоже, не дает результатов в таблице результатов. Между соединенными временами отсутствуют минуты. –

+0

Отсутствуют минуты? – Strawberry

+0

Клубника, это очень близко, но результаты не вовремя. Он показывает 00:03:00, так как первая строка, но 00:00:00 должна быть в начале. Я попытался изменить ваш код на заказ по времени, но не смог. Не могли бы вы еще раз взглянуть. Благодарю. –

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