578 votes

MySQL - mise à JOUR basé sur une requête sur Requête SELECT

J'ai besoin de vérifier (à partir de la même table) si il existe une association entre deux événements en se basant sur la date-heure.

Un jeu de données contient la date de fin-des-temps de certains événements et de l'autre ensemble de données contiendra la date de départ en temps pour d'autres événements.

Si le premier événement se termine avant le deuxième événement, alors je voudrais les relier.

Ce que j'ai pour l'instant 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 me joindre à eux:

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 validation_check domaine, exécutez une requête de mise à JOUR avec le SELECT imbriqué?

919voto

Eric Points 35647

Vous pouvez réellement faire de deux façons:

MySQL mise à jour de la syntaxe de jointure:

update tableA a
left join tableB b on
    a.name_a = b.name_b
set
    validation_check = if(start_dts > end_dts, 'VALID', '')

ANSI SQL syntaxe:

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

Choisir celle qui semble la plus naturelle pour vous.

356voto

massquote Points 519
UPDATE table1 dest, (SELECT * FROM table2 where id=x) src 
  SET dest.col1 = src.col1 where dest.id=x ;

Espérons que cela fonctionne pour vous.

68voto

KMX Points 801

Si quelqu'un cherche à mettre à jour les données d'une base de données à l'autre à n'importe quelle table ils sont de ciblage, il doit y avoir certains critères pour le faire.

C'est mieux 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! Il fonctionne très bien!

Avec au-dessus de la compréhension, vous pouvez modifier l'ensemble des champs et de la "sur les" critères pour faire votre travail. Vous pouvez également effectuer les contrôles, puis tirez les données dans la table temporaire(s), puis exécutez la mise à jour en utilisant la syntaxe ci-dessus pour le remplacement de vos noms de table et colonne.

Espérons que cela fonctionne, si non faites le moi savoir. Je vais écrire une requête exacte pour vous.

30voto

Don Points 345
    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 ;

Espérons que cela vous aidera dans le cas où vous devez faire correspondre et de mise à jour entre deux tables.

14voto

sibaz Points 26

J'ai trouvé cette question dans la recherche de mon propre solution à un très jointure complexe. C'est une solution alternative, pour une version plus complexe du problème, qui je pensais peut-être utile.

J'avais besoin de remplir le product_id champ dans les activités de la table, où les activités sont numérotés dans une unité, et les unités sont numérotées dans un niveau (identifiés à l'aide d'une chaîne de caractères ??N), tels que l'on peut identifier des activités à l'aide d'un SKU ie L1U1A1. Ces Références sont ensuite stockés dans une table différente.

J'ai identifié le suivant pour obtenir une liste de activity_id vs product_id:-

SELECT a.activity_id, w.product_id 
FROM activities a 
JOIN units USING(unit_id) 
JOIN product_types USING(product_type_id) 
JOIN web_products w 
  ON sku=CONCAT('L',SUBSTR(product_type_code,3), 'U',unit_index, 'A',activity_index)

J'ai trouvé que c'était trop complexe à intégrer dans un SELECT dans mysql, j'ai donc créé une table temporaire, et a rejoint avec l'instruction de mise à jour:-

CREATE TEMPORARY TABLE activity_product_ids AS (<the above select statement>);

UPDATE activities a JOIN activity_product_ids b ON a.activity_id=b.activity_id 
  SET a.product_id=b.product_id;

J'espère que quelqu'un trouve cela utile

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X