2016-10-09 2 views
1

Hallo Freunde :) Ich musste einen PHP-Code erstellen, um einige Arbeiter Daten in der DB gespeicherten verarbeiten. Ich habe das gewünschte Ergebnis, aber es dauert Sekunden und Sekunden (Sekunden und Sekunden!>. <) zu beenden, so dass ich leider etwas nicht richtig mache :(Verbessern Sie die Leistung beim Kopieren von Datensätzen von einer Tabelle in eine andere

Die Daten der Arbeiter werden gespeichert in einer mySQL-Tabelle (Tabelle 1), etwa so:

enter image description here

ich bin ein paar Tage, gegeben: initial_date (a) und final_date (b), so ist mein Ziel zu kopieren die Daten der gegebenen Arbeiter in einer neuen Tabelle (Tabelle 2), Tag für Tag von a bis b. Die erwartete Tabelle sollte wie unten gezeigt sein (diese Tabelle wird verwendet) später als Grundlage für die weiteren Operationen, die nicht Teil der Frage ist)

enter image description here

Es ist eine Anforderung alle vorhandenen Daten zwischen a und b Daten überschrieben werden soll, und ‚Sprung‘ Wochenenden und Feiertage.

mein Ziel zu bekommen, ich bin Codierung dieses (annehmen lassen, dass die Verbindung und das alles erledigt ist und die checkworkingday Funktion gegeben ist):

$initialdate = '2016-10-10'; 
$finaldate = '2016-10-12'; 

$x = $initialdate; 

do { 
    if (checkworkingday($x) == true) { 
    $query = mysqli_query($connection,"SELECT name,task FROM table1"); 
    while($row = mysqli_fetch_array($query)) { 
     $task = $row['task']; 
     $worker = $row['name']; 
     $query2 = mysqli_query($connection,"SELECT task FROM table2 WHERE name = '$worker' AND date = '$x'"); 
     $row2 = mysqli_fetch_array($query2); 
     $existingtask = $row2['task']; 
     if (!isset($existingtask)) { 
      mysqli_query($connection,"INSERT INTO table2 (date,name,task) VALUES('".$x."','".$worker."','".$task."')"); 
     } else { 
      mysqli_query($connection,"UPDATE table2 SET task = '".$task."' WHERE date = '".$x."' AND worker = '".$name."'"); 
     } 
    } 
    } 
    $x = date('Y-m-d', strtotime($x . "+1 day")); 
} while ($x <= $finaldate); 

Nur für 3 Tage, wie im Beispiel gezeigt, Es dauert lange, bis es zu Ende ist. und für mehrere Wochen oder Monate dauert es sehr, sehr lange (sogar die maximale Ausführungszeit wird je nach Datumsbereich überschritten!).

Ich bin ein Neuling und ich weiß, dass der Code ziemlich "rustikal" ist, aber ich habe den Code und die Informationen da draußen überarbeitet und überprüft, ohne eine bessere Leistung zu bekommen. Was mache ich falsch? Thanks :)

+0

Sorry, ich habe vergessen, eine weitere Anforderung, die der Tag zwischen a und b zu überprüfen, ist nicht Wochenende oder Feiertag. Gerade bearbeitet. – b1919676

Antwort

0

Statt durch die enitre Daten von looping, versuchen INSERT.. SELECT:

INSERT INTO table2 (date,name,task) 
SELECT date,name,task 
FROM Table1 
WHERE < >; 
+0

Danke sagi! Ich habe gerade den Beitrag bearbeitet, weil ich einen weiteren Requiem vergessen habe (Arbeitstag prüfen). – b1919676

+0

@ b1919676 Woher wissen wir, dass es ein Arbeitstag ist? – sagi

+0

Wie in der Post angegeben, checkworkday ist eine bestimmte Funktion (um zu vermeiden, dass die Post komplizierter). Nehmen wir an, es gibt uns wahr, wenn der Tag ein Arbeitstag ist, und falsch, wenn nicht :) – b1919676

Verwandte Themen