Ich habe ein verzwicktes Problem:
* Meine Tabelle ist sehr groß, d.h. es stehen u.U. 1 Mio oder mehr Datensätze drin.
* Die Tabelle enthält Log-Daten, die alle 30 Sekunden geschrieben wurden.
* Ich muss Datensätze markieren, die vor und nach bestimmten anderen Datensätzen liegen.
Im Klartext:
Die Datensätze werden über die Spalte: LOG_SAVE für weitere Aktionen im Programm markiert 0=speichern, 1= nicht speichern.
Des weiteren gibt es ein LOG_ERRORBYTE, das den kompletten Fehlercode in der Form "00000000" enthält, wobei jede Stelle für einen bestimmten Fehler steht und die Werte von 0-3 annehmen kann.
Ich möchte jetzt über einen SQL-Befehlt alle Datensätze markieren (einmal über LOG_SAVE=1 und andererseits den Wert des LOG_ERRORBYTE ändern) für alle Datensätze, welche einen bestimmten Errorbyte gesetzt haben und 2 Minuten vor und 2 Minuten nach dem fehlerhaften Datensatz liegen. Als Filter wird immer die LOG_HIS_ID genutzt, welche die Zuordnung der Daten zu einem bestimmten Log-File darstellt.
Ich weiß, dass ich das theoretisch auch über PHP machen könnte, aber aufgrund der großen Datenmenge dauert es zu lange.
Der Grundcode ist:
PHP-Code:
UPDATE datenlogs SET LOG_SAVE=1, LOG_ERRORBYTE=INSERT(LOG_ERRORBYTE,$position,1,2)
WHERE SUBSTR(LOG_ERRORBYTE,$position,1)=0 AND LOG_HIS_ID=$his_id
weiter weiß ich nicht und jegliche Versuche, auf umliegende Daten zuzugreifen sind fehlgeschlagen.
Es wäre schön, wenn mir jemand helfen könnte.
Wenn jemand Testdaten haben möchte:
PHP-Code:
CREATE TABLE IF NOT EXISTS `datenlogs` (
`LOG_ID` bigint(19) NOT NULL auto_increment,
`LOG_HIS_ID` int(11) default NULL,
`LOG_DATE` date default NULL,
`LOG_TIME` time default NULL,
`LOG_SAVE` tinyint(1) default '0',
`LOG_ERRORBYTE` varchar(50) default '00000000000000000000',
PRIMARY KEY (`LOG_ID`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
INSERT INTO `nades_datenlogs` (`LOG_ID`, `LOG_HIS_ID`, `LOG_DATE`, `LOG_TIME`, `LOG_SAVE`, `LOG_ERRORBYTE`) VALUES
(1, 2, '2008-01-24', '00:00:03', 0, '00000000000000000000'),
(2, 2, '2008-01-24', '00:00:33', 0, '00000000000000000000'),
(3, 2, '2008-01-24', '00:01:03', 0, '00000000000000000000'),
(4, 2, '2008-01-24', '00:01:33', 0, '00000000000000000000'),
(5, 2, '2008-01-24', '00:02:03', 0, '00000000000000000000'),
(6, 2, '2008-01-24', '00:02:33', 0, '0000000000000000000'),
(7, 2, '2008-01-24', '00:03:03', 0, '00000000000000000000'),
(8, 2, '2008-01-24', '00:03:33', 1, '10000000000000000000'),
(9, 2, '2008-01-24', '00:04:03', 0, '00000000000000000000'),
(10, 2, '2008-01-24', '00:04:33', 0, '00000000000000000000');
(11, 5, '2008-03-26', '23:22:05', 0, '00000000000000000000'),
(12, 2, '2008-01-24', '00:05:33', 0, '00000000000000000000');
(13, 2, '2008-01-24', '00:06:03', 0, '00000000000000000000'),
(14, 2, '2008-01-24', '00:06:33', 0, '00000000000000000000');
Datensatz 8 ist zum Speichern markiert. $position ist für die Beispieldaten 1, $his_id ist 2. Jetzt sollen bei den Daten die Zeilen vor dem DS 8 gefunden werden, welche 2 Minuten davor und 2 Minuten danach sind. Bei ihnen muss die erstel Stelle des LOG_ERRORBYTE als 3 gesetzt werden.
Also es müsste nach der Änderung bei den Datensätzen 4,5,6,7,9,10,12,13 der LOG_ERRORBYTE='10000000000000000000' und LOG_SAVE=1 sein.