Variablenspeicher

Ne, das ist schon richtig so. Im Prinzip wird da ein state geändert, wenn eine bestimmte Zeit vergangen ist. Diese Zeit und andere Werte sind in table2 definiert. Bisher funktioniert das einwandfrei. Ich kenne es aber so aus der Programmierung, dass man Routinen möglichst effizient schreibt und dachte, dass sql da etwas anbietet.
Dies ist eigentlich auch nur ein Bsp. und ich hätte sowas allgemein gern verwendet, unabhängig von der Tabellenstruktur.
 
Hi,

Im Prinzip wird da ein state geändert, wenn eine bestimmte Zeit vergangen ist. Diese Zeit und andere Werte sind in table2 definiert.

Das widerspricht der Vermutung auf schlechtes DB-Design nicht.
Du setzt da ja z.B. Spalte a auf den Wert von Spalte b, falls die Zeitdifferenz zwischen Jetzt und Spalte c größer ist, als in Spalte d und auf den Wert von Spalte e sonst. Das sieht schon nach hochgradig redundanten Daten aus. Und die Werte in Tabelle 1 sollten auch nicht von den Werten in der verknüpften Tabelle 2 abhängig sein. Wenn Dein sog. Status von einem Timestamp und anderen Werten in Tabelle 2 abhängt, dann berechne ihn beim Auslesen, statt ihn (als redundante Information) zusätzlich in die Haupttabelle zu schreiben.

Bisher funktioniert das einwandfrei. Ich kenne es aber so aus der Programmierung, dass man Routinen möglichst effizient schreibt und dachte, dass sql da etwas anbietet.

Das ineffizienteste an dieser Abfrage wird wohl sein, dass MySQL nicht einfach die betroffenen Datensätze (WHERE Spalte1 = Spalte2 ist auch schon wieder so ein Indiz für Datenredundanz) mit bestimmten Werten updaten kann, sondern Zeile für Zeile vorhandene Werte extra prüfen muss. Dass diese Prüfung und das Wählen der neuen Werte dann ein dreimaliges TIMESTAMPDIFF beinhaltet, ist da wohl eher zu vernachlässigen...

LG
 
Also. Ich poste das mal etwas übersichtlicher:

SQL:
UPDATE table1
                JOIN table2
            ON table1.ID=table2.geid
            SET
                table1.e=IF(TIMESTAMPDIFF(SQL_TSI_SECOND,table1.lastcheck,FROM_UNIXTIME($now))>=table2.bz,table2.m,$s+TIMESTAMPDIFF(SQL_TSI_SECOND,table1.lastcheck,FROM_UNIXTIME($now))*(table2.m- $s)/table2.bz) ,
                table1.b=IF(TIMESTAMPDIFF(SQL_TSI_SECOND,table1.lastcheck,FROM_UNIXTIME($now))>=table2.bz,$bp,$bb),
                table1.lastcheck=IF(TIMESTAMPDIFF(SQL_TSI_SECOND,table1.lastcheck,FROM_UNIXTIME($now))>=table2.bz,TIMESTAMP(table1.lastcheck,FROM_UNIXTIME(table1.bz)) ,table1.lastcheck)
            WHERE table2.b=$bb

Ich glaube schon, dass es da keine viel sinnvollere DB-Struktur gibt. Man könnte vielleicht andersrum join-en aber das ergibt meiner Meinung nach nicht viel mehr Sinn.

PS: $bp und $bb sind unterschiedliche states; gespeichert in table1.b
 
Zuletzt bearbeitet:
Zurück