MySQL - UPDATE query gebaseerd op SELECT query

Ik moet (vanuit dezelfde tabel) controleren of er een verband is tussen twee gebeurtenissen op basis van datum-tijd.

Eén set gegevens bevat de einddatum van bepaalde gebeurtenissen en de andere set gegevens bevat de begindatum van andere gebeurtenissen.

Als de eerste gebeurtenis eerder eindigt dan de tweede, dan wil ik ze aan elkaar koppelen.

Wat ik tot nu toe heb is:

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

Dan voeg ik me bij hen:

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

Kan ik dan, op basis van mijn validation_check veld, een UPDATE query uitvoeren met de SELECT genest?

Oplossing

Je kunt dit op twee manieren doen:

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 syntaxis:

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)

Kies degene die voor jou het meest natuurlijk lijkt.

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

Hopelijk werkt dit voor jou.

Commentaren (3)

Als iemand gegevens wil bijwerken van de ene database naar de andere, ongeacht de tabel waarop hij zich richt, moet er een criterium zijn om dat te doen.

Deze is beter en schoon voor alle niveaus:

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! Het werkt geweldig!

Met het bovenstaande begrip, kun je de set fields en "on" criteria aanpassen om je werk te doen. U kunt ook de controles uitvoeren, dan de gegevens in de tijdelijke tabel(len) trekken en dan de update uitvoeren met de bovenstaande syntaxis en uw tabel- en kolomnamen vervangen.

Hopelijk werkt het, zo niet laat het me weten. Ik zal een exacte query voor je schrijven.

Commentaren (0)