671 Stimmen

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 die Anfangszeit für andere Ereignisse.

Wenn das erste Ereignis vor dem zweiten Ereignis abgeschlossen ist, möchte ich die beiden Ereignisse 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?

1047voto

Eric Punkte 87889

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 das, was Ihnen am natürlichsten erscheint.

416voto

massquote Punkte 4047
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.

172voto

Sergio Punkte 2187

Einfach in MySQL:

UPDATE users AS U1, users AS U2 
SET U1.name_one = U2.name_colX
WHERE U2.user_id = U1.user_id

84voto

KMX Punkte 2481

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.

Dieser ist besser und sauber für alle Stufen:

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 eingestellten Felder und "Ein"-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 unter Ersetzung Ihrer Tabellen- und Spaltennamen durchführen.

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

35voto

Don Srinath Punkte 1507
UPDATE 
  receipt_invoices dest,
  (
    SELECT 
      `receipt_id`,
      CAST((net * 100) / 112 AS DECIMAL (11, 2)) witoutvat 
    FROM
      receipt 
    WHERE CAST((net * 100) / 112 AS DECIMAL (11, 2)) != total 
      AND vat_percentage = 12
  ) src 
SET
  dest.price = src.witoutvat,
  dest.amount = src.witoutvat 
WHERE col_tobefixed = 1 
  AND dest.`receipt_id` = src.receipt_id ;

Ich hoffe, dies hilft Ihnen in einem Fall, in dem Sie zwei Tabellen abgleichen und aktualisieren müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X