2017-12-28 5 views
0

Ich habe eine Reihe hilfreicher Antworten zum Aktualisieren von Tabellenwerten aus einer anderen Tabelle mit mehreren Werten basierend auf einem Zeitstempel mit einer MAX() - Unterabfrage gesehen.MYSQL-Update von einer anderen Tabelle mit mehreren Einträgen

z.B. Update another table based on latest record

Ich fragte mich, wie das im Vergleich zu einem ALTER zuerst und auf die Reihenfolge in der Tabelle, um die UPDATE zu vereinfachen vergleicht. Etwas wie folgt aus:

ALTER TABLE `table_with_multiple_data` ORDER BY `timestamp` DESC; 

UPDATE `table_with_single_data` as `t1` 
    LEFT JOIN `table_with_multiple_data` AS `t2` 
    ON `t1`.`id`=`t2`.`t1id` 
    SET `t1`.`value` = `t2`.`value`; 

(Entschuldigung für die Pseudo-Code, aber ich hoffe, Sie bekommen, was ich frage)

beide das gleiche für mich zu erreichen, aber haben nicht wirklich groß genug Datensatz zu sehen irgendein Unterschied in der Geschwindigkeit.

Danke !!

+3

** Niemals ** verlassen Sie sich auf eine ** angenommene ** Reihenfolge der Datensätze in einer Tabelle. – Uueerdo

+0

Das Ergebnis würde nicht dasselbe bewirken: In der SQL-Reihenfolge ist nicht garantiert, so dass die Daten in Ihrer Tabelle in einer SQL-Anweisung nichts garantieren (meistens würde dies das von Ihnen erwartete Ergebnis anzeigen, aber manchmal nur wird nicht): Wenn sich die Daten bereits im Speicher befinden, kann die Datenbank-Engine möglicherweise entscheiden, die Join-Reihenfolge anders als erwartet auszuführen. –

+0

Danke! Ich dachte, es könnte einen Grund dafür geben, dass die ALTER-Methode nie zuvor beantwortet wurde !!! –

Antwort

1

Normalerweise würden Sie eine korrelierte Unterabfrage verwenden:

UPDATE table_with_single_data t1 
    SET t1.value = (select t2.value 
        from table_with_multiple_data t2 
        where t2.t1id = t1.id 
        order by t2.timestamp desc 
        limit 1 
       ); 

Wenn Ihre Methode zu arbeiten, geschieht, das ist nur Zufall. Selbst wenn MySQL die Reihenfolge der Tabellen respektiert, würde diese Reihenfolge die Operation join nicht überleben. Ganz zu schweigen von der Tatsache, dass es keine Garantie gibt, dass * der * Wert zugewiesen wird, wenn mehrere übereinstimmende Zeilen vorhanden sind.

+0

Danke. Ich habe es geschafft, eine ganz andere Version davon zu bekommen, die gut funktioniert! –

Verwandte Themen