MySQL - Consulta UPDATE basada en una consulta SELECT

Necesito comprobar (desde la misma tabla) si existe una asociación entre dos eventos basada en la fecha-hora.

Un conjunto de datos contendrá la fecha-hora de finalización de ciertos eventos y el otro conjunto de datos contendrá la fecha-hora de inicio de otros eventos.

Si el primer evento finaliza antes que el segundo, me gustaría vincularlos.

Lo que tengo hasta ahora es:

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

Entonces me uno a ellos:

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

¿Puedo entonces, basándome en mi campo validation_check, ejecutar una consulta UPDATE con el SELECT anidado?

Solución

Puedes hacerlo de dos maneras:

La sintaxis de actualización de MySQL:

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

Sintaxis ANSI SQL:

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)

Elija la que le parezca más natural.

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

Espero que esto te sirva.

Comentarios (3)

Si alguien quiere actualizar datos de una base de datos a otra, independientemente de la tabla a la que se dirija, debe haber algún criterio para hacerlo.

Este es mejor y limpio para todos los niveles:

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! ¡Funciona muy bien!

Con la comprensión anterior, puede modificar los campos de conjunto y "on" criterios para hacer su trabajo. También puede realizar las comprobaciones, luego extraer los datos en la(s) tabla(s) temporal(es) y luego ejecutar la actualización utilizando la sintaxis anterior sustituyendo sus nombres de tabla y columna.

Espero que funcione, si no, hágamelo saber. Voy a escribir una consulta exacta para usted.

Comentarios (0)