MySQL - UPDATE-Abfrage basierend auf SELECT-Abfrage

Ich muss überprüfen (aus derselben Tabelle), ob es eine Assoziation zwischen zwei Ereignissen auf der Grundlage von Datum und Uhrzeit gibt.

Ein Datensatz enthält die Endzeit bestimmter Ereignisse und der andere Datensatz enthält die Anfangszeit für andere Ereignisse.

Wenn das erste Ereignis vor dem zweiten Ereignis abgeschlossen ist, möchte ich sie miteinander verknüpfen.

Was ich bis jetzt habe, ist:

SELECT name as name_A, date-time as end_DTS, id as id_A 
FROM tableA WHERE criteria = 1

SELECT name as name_B, date-time as start_DTS, id as id_B 
FROM tableA WHERE criteria = 2

Dann schließe ich mich ihnen an:

SELECT name_A, name_B, id_A, id_B, 
if(start_DTS > end_DTS,'VALID','') as validation_check
FROM tableA
LEFT JOIN tableB ON name_A = name_B

Kann ich dann, basierend auf meinem validation_check Feld, eine UPDATE Abfrage mit dem SELECT verschachtelt ausführen?

Lösung

Es gibt zwei Möglichkeiten, wie Sie dies tun können:

MySQL update join syntax:

UPDATE tableA a
INNER JOIN tableB b ON a.name_a = b.name_b
SET validation_check = if(start_dts > end_dts, 'VALID', '')
-- where clause can go here

ANSI-SQL-Syntax:

UPDATE tableA SET validation_check = 
    (SELECT if(start_DTS > end_DTS, 'VALID', '') AS validation_check
        FROM tableA
        INNER JOIN tableB ON name_A = name_B
        WHERE id_A = tableA.id_A)

Wählen Sie die Syntax, die Ihnen am natürlichsten erscheint.

Kommentare (8)
UPDATE
    `table1` AS `dest`,
    (
        SELECT
            *
        FROM
            `table2`
        WHERE
            `id` = x
    ) AS `src`
SET
    `dest`.`col1` = `src`.`col1`
WHERE
    `dest`.`id` = x
;

Ich hoffe, das funktioniert bei Ihnen.

Kommentare (3)

Wenn jemand Daten von einer Datenbank in eine andere aktualisieren möchte, unabhängig davon, auf welche Tabelle er abzielt, muss es einige Kriterien geben, um dies zu tun.

Diese ist besser und sauber für alle Ebenen:

UPDATE dbname1.content targetTable

LEFT JOIN dbname2.someothertable sourceTable ON
    targetTable.compare_field= sourceTable.compare_field
SET
    targetTable.col1  = sourceTable.cola,
    targetTable.col2 = sourceTable.colb, 
    targetTable.col3 = sourceTable.colc, 
    targetTable.col4 = sourceTable.cold 

Traaa! Das funktioniert super!

Mit dem obigen Verständnis können Sie die Set-Felder und "on" Kriterien ändern, um Ihre Arbeit zu erledigen. Sie können auch die Prüfungen durchführen, dann die Daten in die temporäre(n) Tabelle(n) ziehen und dann die Aktualisierung mit der obigen Syntax durchführen, indem Sie Ihre Tabellen- und Spaltennamen ersetzen.

Ich hoffe, es funktioniert, wenn nicht, lassen Sie es mich wissen. Ich werde eine genaue Abfrage für Sie schreiben.

Kommentare (0)