2016-05-16 4 views
-4

Ich versuche, ein dynamisches Diagramm mit einer stabilen Zeitleiste zu erstellen, daher muss ich zusätzliche Zeit (Minuten) zur X-Achse hinzufügen. Ich brauche 2 Spalten. Spalte 1 (Zeit) zeigt jede Minute des Tages aus einer Tabelle, die einfach eine Zeitspaltenliste von 00:00 bis 23:59 auflistet (die Beispieltabelle hat nur 20 Minuten). Ich versuche, dies mit den Ergebnissen aus der 'Log' Tabelle zu verbinden. Die Abfrage wird filtern, welchen Rechner 'Name' ich sehe, zB Machine 'Name' '1'. Listen Sie dann auf, wenn dieser Computer den Status neben den 1440 Minuten aus der 'TimeMins'-Tabelle geändert hat. Ich hoffe das hilft? Letztendlich habe ich ein dynamisches Diagramm, das die Zustandsänderungen für eine Maschine während des ganzen Tages zeigt. Die 'Zeit'-Spalte wird die X-Achse für das Diagramm einstellen, was eine stetige Zeitlinie ergibt.Zeit in Linksbindung - MYSQL

Leider kann ich es nicht richtig verbinden. Vielleicht gibt es einen anderen Weg oder kann jemand das Problem bitte knacken?

Das Ergebnis ähnlich sein sollte ...

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 

etc. Ein Wert für jede Minute des Tages, ob es für diese Minute oder kein Ergebnis in ‚log‘ war.

Sehr geschätzt. War schon seit über 2 Tagen dabei. Hier

ist die SQLfiddle:

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

Dank. Jamie.

+0

Ich bearbeitet, aber die Seite hat nicht aktualisiert, wie ich es geschrieben habe. 2 Spalten. "Zeit" und "Staat". Vielen Dank. –

+0

Erdbeere bitte sehen Sie meine Kommentare unten. Ihre Hilfe wäre sehr dankbar, danke. –

+0

Fair genug. Habe es dankend bearbeitet. –

Antwort

0

Sie können innere Auswahl verwenden.

Im Beispiel unten Ich bin 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; 

2. Verwendung ist der Anfang und das Ende für jede Maschine ist

die erste Bereitstellung der zweiten Umhüllung und es ist nur Sekunden für jeden Lauf zu berechnen und Sortierung des Ergebnisses durch Start

die 3. nächste Zeile zu finden versucht, wenn die Maschine nach dem Start die a.ts stoppt und Zustand 0 mit dem gleichen Namen (die gleiche Maschine entsprechen)

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

Danke Richard, aber das ist nicht ganz das, was ich suche. Meine schlechte Erklärung. Ich brauche 2 Spalten.Spalte 1 (Zeit) zeigt jede Minute des Tages aus einer Tabelle, die einfach eine Zeitspaltenauflistung von 00:00 bis 23:59 hat. Ich versuche, dies mit den Ergebnissen aus der 'Log' Tabelle zu verbinden. Die Abfrage wird filtern, welchen Rechner 'Name' ich sehe, zB '1'. Listen Sie dann auf, wenn dieser Computer den Status neben den 1440 Minuten aus der 'TimeMins'-Tabelle geändert hat. Ich hoffe das hilft? –

+0

Letztendlich habe ich ein dynamisches Diagramm, das die Zustandsänderungen für eine Maschine den ganzen Tag anzeigt. In der Spalte "Zeit" wird die X-Achse für das Diagramm festgelegt, um eine konstante Zeitlinie zu erhalten. –

0

Ich befürworte dies nicht als Lösung (und auch bei diesem Verfahren gibt es sicherlich optimalere Möglichkeiten, diese Abfrage zu schreiben), aber nur zu Veranschaulichungs ...

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

Danke Erdbeere, aber Ihre Lösung scheint nicht die Ergebnisse auf Ihrer Ergebnistabelle zu geben. Zwischen den verbundenen Zeiten fehlen Minuten. –

+0

Fehlende Minuten? – Strawberry

+0

Erdbeere, es ist sehr nah, aber die Ergebnisse sind nicht in der richtigen Reihenfolge. Es zeigt 00:03:00 als erste Zeile, aber 00:00:00 sollte am Anfang stehen. Ich habe versucht, den Code nach der Zeit zu ändern, konnte dies aber nicht. Könnten Sie bitte noch einen Blick darauf werfen? Vielen Dank. –