Wir haben diese MySQL-Abfrage, wo wir die date_time
und price_open
aus price
Tabelle und aktualisieren diese beiden Werte in die price_datetime
und price_open
Spalten in comment
Tabelle finden wollen:Abfrage gestoppt laufen statt Einfügen Nullwerte
UPDATE comment AS fc
INNER JOIN price AS p
ON p.ticker_id = fc.ticker_id
AND p.date_time =
(SELECT pi.date_time
FROM price AS pi
WHERE pi.ticker_id = fc.ticker_id
AND pi.date_time >= fc.date_time
ORDER BY pi.date_time ASC
LIMIT 1
) SET
fc.price_datetime = p.date_time,
fc.price_open = p.price_open;
was wir zu PHP + MySQL konvertiert der Hoffnung auf eine höhere Effizienz und viel schneller Prozess:
<?php
ob_flush();
flush();
usleep(160);
$tickers = array();
$stmt = $mysqli->prepare("SELECT ticker_id, date_time FROM flaggedcomment order by ticker_id, date_time");
$stmt->execute(); //Execute prepared Query
$stmt->bind_result($tid, $dt);
$arr_index = 0;
while ($stmt->fetch()) {
$tickers[$arr_index] = array();
$tickers[$arr_index]["id"] = $tid;
$tickers[$arr_index]["dt"] = $dt;
$arr_index++;
}
/* free result set */
$stmt->free_result();
$record_index = 0;
$flaggedcomment_index = 0;
$sql = "";
// get total tickers
$total_tickers = count($tickers);
echo "Total records: " . $total_tickers . "<br />";
foreach ($tickers as $ticker) { //fetch values
$stmt = $mysqli->prepare("SELECT price_open, date_time FROM price WHERE ticker_id =? AND date_time >=? ORDER BY date_time ASC LIMIT 1;");
$stmt->bind_param("is",$ticker["id"], $ticker["dt"]); // two params: one is integer, and other one is string
$stmt->execute(); //Execute prepared Query
$results = $stmt->get_result();
$myrow = $results->fetch_row();
$set_string = "SET";
// bind values
$price_open = $myrow[0];
$date_time = $myrow[1];
// set initial insert query value
$set_string .= " price_datetime='". $date_time ."'";
$set_string .= ", price_open=". $price_open;
$set_string .= " WHERE ticker_id=". $ticker["id"] ." AND date_time='" . $ticker["dt"] ."'";
if($set_string != ""){
$sql .= "UPDATE flaggedcomment ". $set_string . ";";
}
$idx = $record_index + 1;
if(($record_index + 1) % 100 == 0){
?>
<script>
$('#page-wrap > h1').html("Processing Ticker id #" + <?= $ticker["id"]; ?> + " - Record #" + <?= $idx; ?>);
</script>
<?php
ob_flush();
flush();
usleep(160);
}
$record_index++;
/* free result set */
$stmt->free_result();
} // end while fetch ticker id
$update_flaggedcomment_qry = "LOCK TABLES flaggedcomment WRITE; ". $sql . "UNLOCK TABLES; ";
echo $update_flaggedcomment_qry;
//echo "<br />";
if ($mysqli->multi_query($update_flaggedcomment_qry)) {
// nothing
} else {
echo "Error updating record: " . $mysqli->error . "<br />";
$mysqli->close();
exit;
}
echo "<span style='color:blue;'> <b> Done. </b> </span>";
ob_end_flush();
exit;
?>
Verwendung des MySQL-Abfrage, wenn es keine Übereinstimmung von 012.318.036 istund date_time
aus beiden Tabellen, die fc.price_datetime
und fc.price_open
Spalten zeigen 0000-00-00 00:00:00
und 0.00
Werte. Wenn Sie den PHP-Code ausführen, wird er jedoch nicht die Nullwerte einfügen, sondern erst dann, wenn sein allererstes "no matching" von ticker_id
und date_time
auftritt und er nicht fortgesetzt werden kann. Wir haben lange darüber nachgedacht, wie wir es beheben können, leider kann keine der Möglichkeiten, die wir verwenden, dies beheben.
Jede Hilfe von der Gemeinschaft wird definitiv sehr geschätzt.
Vielen Dank. :)
Wenn Sie "in die Kommentartabelle einfügen" möchten, warum verwenden Sie 'update'? –
@GordonLinoff Entschuldigung, falscher Begriff wird verwendet, ich möchte "updaten", weil es bereits vorhandene Spalten mit Informationen gefüllt gibt. Ich werde bearbeiten. – Shyuan