MySQL - Requête UPDATE basée sur la requête SELECT

Je dois vérifier (à partir de la même table) s'il existe une association entre deux événements basée sur la date et l'heure.

Un ensemble de données contient la date et l'heure de fin de certains événements et l'autre ensemble de données contient la date et l'heure de début d'autres événements.

Si le premier événement se termine avant le second, j'aimerais les relier.

Ce que j'ai jusqu'à présent est :

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

Puis je les rejoins :

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

Puis-je ensuite, en fonction de mon champ validation_check, exécuter une requête UPDATE avec le SELECT imbriqué ?

Solution

Vous pouvez en fait procéder de deux façons :

Syntaxe de jointure de mise à jour 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

Syntaxe 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)

Choisissez celle qui vous semble la plus naturelle.

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

J'espère que cela fonctionnera pour vous.

Commentaires (3)

Si quelqu'un cherche à mettre à jour des données d'une base de données à une autre, quelle que soit la table qu'il vise, il doit y avoir des critères pour le faire.

Celui-ci est meilleur et propre pour tous les niveaux :

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 ! Ca marche bien !

Avec la compréhension de ce qui précède, vous pouvez modifier les champs définis et les critères "on&quot ; pour faire votre travail. Vous pouvez également effectuer les vérifications, puis transférer les données dans la ou les tables temporaires et ensuite exécuter la mise à jour en utilisant la syntaxe ci-dessus en remplaçant les noms de vos tables et colonnes.

J'espère que cela fonctionnera, sinon faites-le moi savoir. Je vais écrire une requête exacte pour vous.

Commentaires (0)