SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Das Zend Framework

Das Zend Framework zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQL

MySQL Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQL diskutieren

Antwort
 
Themen-Optionen Ansicht
  #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
  #2  
Alt 14.01.2009, 15:40:13
Crisps Crisps ist offline
Junior Member
 
Registriert seit: Oct 2008
Alter: 43
Beiträge: 274
AW: Zeilen per SQL vor und nach einem bestimmten Datensatz ändern

Ich hab erst ein paar Fragen bevor ich mir das genauer anschauen kann. Vielleicht kannst du mir die beantworten?

1. Warum ist das Datum und die Zeit nicht gleich in einer Spalte mit DATETIME abgespeichert? Das würde es einfacher machen.

2. Du sagt, dass alle LOG_IDs die zwei Minuten vor und nach dem bestimmten Eintrag bestehen (4,5,6,7,9,10,12,13) upgedatet werden sollen. Aber ID 13 ist nicht in diesem Zeitfenster, wenn ich das richtig sehe.

3. Der Eintrag mit der ID 11 hat eine Zeit von 24:22:05 - warum fällt das Zeitformat hier aus der Reihe (24 anstatt 00)? Ich bin mir nämlich nicht sicher, wie die MySQL Date/Time-Funktionen darauf reagieren würden.

Geändert von Crisps (14.01.2009 um 18:39:42 Uhr)
Mit Zitat antworten
  #3  
Alt 15.01.2009, 11:06:40
Schiergl Schiergl ist offline
Anfänger
 
Registriert seit: Jan 2009
Alter: 49
Beiträge: 3
AW: Zeilen per SQL vor und nach einem bestimmten Datensatz ändern

Hallo,
danke für die Hilfe und zu deinen Fragen:
Zitat:
Zitat von Crisps Beitrag anzeigen
1. Warum ist das Datum und die Zeit nicht gleich in einer Spalte mit DATETIME abgespeichert? Das würde es einfacher machen.
Das Datum und die Zeit wird bei uns immer getrennt abgespeichert, da alles über ein CMS-System läuft und mit verschiedenen Datenbanken funktionieren muss. Daher mischen wir Datum und Zeit nie, da dies bisher zu Problemen geführt hat.

Zitat:
Zitat von Crisps Beitrag anzeigen
2. Du sagt, dass alle LOG_IDs die zwei Minuten vor und nach dem bestimmten Eintrag bestehen (4,5,6,7,9,10,12,13) upgedatet werden sollen. Aber ID 13 ist nicht in diesem Zeitfenster, wenn ich das richtig sehe.
Ja. Der Datensatz 11 wurde manuell von mir eingefügt, damit man sehen kann, dass die Daten selektiv bearbeitet werden müssen und man nicht über die ID direkt arbeiten kann, da zwischendrin Daten stehen können, die zu einem anderen Logger gehören.

Zitat:
Zitat von Crisps Beitrag anzeigen
3. Der Eintrag mit der ID 11 hat eine Zeit von 24:22:05 - warum fällt das Zeitformat hier aus der Reihe (24 anstatt 00)? Ich bin mir nämlich nicht sicher, wie die MySQL Date/Time-Funktionen darauf reagieren würden.
Fehler von mir, muss 23:22:05 heißen.
Mit Zitat antworten
  #4  
Alt 15.01.2009, 13:34:41
Crisps Crisps ist offline
Junior Member
 
Registriert seit: Oct 2008
Alter: 43
Beiträge: 274
AW: Zeilen per SQL vor und nach einem bestimmten Datensatz ändern

Zu 2. - Ich meinte eigentlich, dass der Eintrag mit der ID 13 nicht innerhalb von +2 Minuten sein kann, wenn man von ID Nr. 8 ausgeht. Aber vielleicht war das sowieso nur ein Tippfehler.

Zitat:
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.
Zu LOG_ERRORBYTE - Mit:
Code:
LOG_ERRORBYTE=INSERT(LOG_ERRORBYTE, 1, 1, 2)
würde dieser aber auf 20000000000000000000 gesetzt, nicht auf 10000000000000000000. Wenn ich das richtig interpretiere. Ich weiß nicht, wass du mit dieser INSERT Funktion vor hast, willst du vielleicht nur den Wert von LOG_ERRORBYTE ID #8 in die anderen Spalten kopieren?

Eine halbfertige Lösung...
Code:
UPDATE datenlogs AS p
INNER 
  JOIN datenlogs AS c
    ON c.LOG_HIS_ID = p.LOG_HIS_ID
   AND CAST(CONCAT(p.LOG_DATE,' ', p.LOG_TIME) AS DATETIME)
       BETWEEN SUBTIME(CAST(CONCAT(c.LOG_DATE,' ', c.LOG_TIME) AS DATETIME), '0:2:0')
       AND ADDTIME(CAST(CONCAT(c.LOG_DATE,' ', c.LOG_TIME) AS DATETIME), '0:2:0')
   SET c.LOG_SAVE = 1
     , c.LOG_ERRORBYTE = INSERT(c.LOG_ERRORBYTE, $position, 1, 2) 
 WHERE p.LOG_HIS_ID = $his_id
   AND ???;
Mit dieser Query werden eben die Einträge aktualisiert, die in diesem +-2 Minuten Bereich sind. Der Eintrag mit der Nr. 8 wird allerdings nicht verändert.

Zum rot markierten Teil: Ich bin mir nicht sicher, wie die ID Nr. 8 als Basis überhaupt ausgewählt wird, da der Code Schnipsel im ersten Beitrag alle Einträge ausser eben dieser #8 auswählt. Wird dieser 'Basiseintrag' über den Anfang des Errocodes ausgewählt, oder ob LOG_SAVE auf 1 steht, oder sogar beides?

Zur Performance Verbesserung wäre auch noch folgender Index zu setzen:
Code:
ALTER TABLE datenlogs ADD INDEX (LOG_HIS_ID);
Leider kann man diesen nicht auch noch auf die Date und Time Spalten erweitern, da Funktionen keinen Index nutzen können.

Geändert von Crisps (15.01.2009 um 14:13:35 Uhr)
Mit Zitat antworten
  #5  
Alt 16.01.2009, 16:14:23
Schiergl Schiergl ist offline
Anfänger
 
Registriert seit: Jan 2009
Alter: 49
Beiträge: 3
AW: Zeilen per SQL vor und nach einem bestimmten Datensatz ändern

Hallo und vielen Dank für die Hilfe.

Das Ändern der einen Stelle des LOG_ERRORBYTES war beabsichtigt.

Meine endgültige Anweisung, die HERVORRAGEND funktioniert lautet:

PHP-Code:
UPDATE datenlogs AS p
INNER 
  JOIN datenlogs 
AS c
    ON c
.LOG_HIS_ID p.LOG_HIS_ID
   
AND CAST(CONCAT(p.LOG_DATE,' 'p.LOG_TIME) AS DATETIME)
       
BETWEEN SUBTIME(CAST(CONCAT(c.LOG_DATE,' 'c.LOG_TIME) AS DATETIME), '0:2:0')
       AND 
ADDTIME(CAST(CONCAT(c.LOG_DATE,' 'c.LOG_TIME) AS DATETIME), '0:2:0')
   
SET c.LOG_SAVE 1
     
c.LOG_ERRORBYTE INSERT(c.LOG_ERRORBYTE112
 
WHERE p.LOG_HIS_ID 2
   
AND SUBSTR(p.LOG_ERRORBYTE,1,1)='1' 
   
AND SUBSTR(c.LOG_ERRORBYTE,1,1)='0' 
Dies ist ein Beispiel, welchen das erste Byte des LOG_ERRORBYTE überprüft und die Datensätze der vorangegangenen und nachfolgenden 2 Minuten ändert, sofern beim Datensatz die erste Position des LOG_ERRORBYTE=1 und die umliegenden =0 sind.

VIELEN DANK noch mal. Ich wäre nie darauf gekommen.
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Sprachwahl bei bestimmten einträgen in der SQL Datenbank Slappi PHP Grundlagen 1 02.10.2006 17:54:31
Abfrage einer bestimmten Spalte in SQL LV2005 MySQL 7 01.08.2006 19:15:54
Alle Zeilen mit bestimmten Wert ausgeben koerschgen2001 PHP Grundlagen 2 23.11.2005 18:09:31
Einen bestimmten Datensatz am ende einer Liste JansonChristian PHP für Fortgeschrittene und Experten 1 29.05.2005 13:18:36
aus Datei je 10 Zeilen neue Liste? doudie PHP für Fortgeschrittene und Experten 3 29.08.2002 21:58:46


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:54:36 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.


© 2001-2019 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt