Einzelnen Beitrag anzeigen
  #1  
Alt 14.01.2009, 12:28:04
Schiergl Schiergl ist offline
Anfänger
 
Registriert seit: Jan 2009
Alter: 49
Beiträge: 3
Zeilen per SQL vor und nach einem bestimmten Datensatz ändern

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=1LOG_ERRORBYTE=INSERT(LOG_ERRORBYTE,$position,1,2
WHERE SUBSTR(LOG_ERRORBYTE,$position,1)=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_IDbigint(19NOT NULL auto_increment,
  `
LOG_HIS_IDint(11) default NULL,
  `
LOG_DATEdate default NULL,
  `
LOG_TIMEtime default NULL,
  `
LOG_SAVEtinyint(1) default '0',
  `
LOG_ERRORBYTEvarchar(50) default '00000000000000000000',
  
PRIMARY KEY  (`LOG_ID`)
TYPE=MyISAM  AUTO_INCREMENT=;

INSERT INTO `nades_datenlogs` (`LOG_ID`,  `LOG_HIS_ID`, `LOG_DATE`, `LOG_TIME`, `LOG_SAVE`, `LOG_ERRORBYTE`) VALUES
(12'2008-01-24''00:00:03'0'00000000000000000000'),
(
22'2008-01-24''00:00:33'0'00000000000000000000'),
(
32'2008-01-24''00:01:03'0'00000000000000000000'),
(
42'2008-01-24''00:01:33'0'00000000000000000000'),
(
52'2008-01-24''00:02:03'0'00000000000000000000'),
(
62'2008-01-24''00:02:33'0'0000000000000000000'),
(
72'2008-01-24''00:03:03'0'00000000000000000000'),
(
82'2008-01-24''00:03:33'1'10000000000000000000'),
(
92'2008-01-24''00:04:03'0'00000000000000000000'),
(
102'2008-01-24''00:04:33'0'00000000000000000000');
(
115'2008-03-26''23:22:05'0'00000000000000000000'),
(
122'2008-01-24''00:05:33'0'00000000000000000000');
(
132'2008-01-24''00:06:03'0'00000000000000000000'),
(
142'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.

Geändert von Schiergl (15.01.2009 um 11:07:13 Uhr)
Mit Zitat antworten