table - update sql mysql php




MySQL-consulta UPDATE baseada na consulta SELECT (8)

Eu encontrei esta questão em procurar minha própria solução para uma junção muito complexa. Esta é uma solução alternativa, para uma versão mais complexa do problema, que achei útil.

Eu precisava preencher o campo product_id na tabela de atividades, onde as atividades são numeradas em uma unidade e as unidades são numeradas em um nível (identificadas usando uma string ?? N), de modo que se possa identificar atividades usando um SKU, ou seja, L1U1A1. Essas SKUs são então armazenadas em uma tabela diferente.

Identifiquei o seguinte para obter uma lista 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)

Eu achei que era muito complexo para incorporar em um SELECT dentro do mysql, então eu criei uma tabela temporária, e juntei isso com a instrução update: -

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;

Espero que alguém ache isso útil

Eu preciso verificar (da mesma tabela) se houver uma associação entre dois eventos com base no tempo de data.

Um conjunto de dados conterá a data e a hora de término de determinados eventos e o outro conjunto de dados conterá a data e hora de início de outros eventos.

Se o primeiro evento for concluído antes do segundo evento, eu gostaria de vinculá-los.

O que eu tenho até agora é:

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

Então eu me uno a eles:

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

Posso então, com base no meu campo validation_check, executar uma consulta UPDATE com o SELECT aninhado?


Eu tive um problema com entradas duplicadas em uma tabela. Abaixo estão as abordagens estavam trabalhando para mim. Também foi defendido pelo @sibaz.

Finalmente eu resolvi usando as consultas abaixo:

  1. A consulta de seleção é salva em uma tabela temporária

    IF OBJECT_ID(N'tempdb..#New_format_donor_temp', N'U') IS NOT NULL
        DROP TABLE #New_format_donor_temp;
    
    select *
    into #New_format_donor_temp
    from DONOR_EMPLOYMENTS
    where DONOR_ID IN (
      1, 2
    )
    
    -- Test New_format_donor_temp
    -- SELECT *
    -- FROM #New_format_donor_temp;
  2. A tabela temporária é unida na consulta de atualização.

    UPDATE de
    SET STATUS_CD=de_new.STATUS_CD, STATUS_REASON_CD=de_new.STATUS_REASON_CD, TYPE_CD=de_new.TYPE_CD
    FROM DONOR_EMPLOYMENTS AS de
      INNER JOIN #New_format_donor_temp AS de_new ON de_new.EMP_NO = de.EMP_NO
    WHERE
      de.DONOR_ID IN (
        3, 4
    )

Eu não tenho muita experiência com SQL, por favor, informe qualquer abordagem melhor que você conhece.

As consultas acima são para o servidor MySql.


Para a mesma mesa,

UPDATE PHA_BILL_SEGMENT AS PHA,
     (SELECT BILL_ID, COUNT(REGISTRATION_NUMBER) AS REG 
       FROM PHA_BILL_SEGMENT
        GROUP BY REGISTRATION_NUMBER, BILL_DATE, BILL_AMOUNT
        HAVING REG > 1) T
    SET PHA.BILL_DATE = PHA.BILL_DATE + 2
 WHERE PHA.BILL_ID = T.BILL_ID;

Se alguém está procurando atualizar dados de um banco de dados para outro, não importa qual tabela eles estejam segmentando, deve haver alguns critérios para isso.

Este é melhor e limpo para todos os níveis:

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! Isso funciona muito bem!

Com o entendimento acima, você pode modificar os campos definidos e os critérios "on" para fazer o seu trabalho. Você também pode executar as verificações, depois puxar os dados para as tabelas temporárias e, em seguida, executar a atualização usando a sintaxe acima, substituindo os nomes de tabela e coluna.

Espero que funcione, se não me avise. Vou escrever uma consulta exata para você.


Você pode atualizar valores de outra tabela usando inner join como este

UPDATE [table1_name] AS t1 INNER JOIN [table2_name] AS t2 ON t1.column1_name] = t2.[column1_name] SET t1.[column2_name] = t2.column2_name];

Siga aqui para saber como usar essa consulta http://www.voidtricks.com/mysql-inner-join-update/

ou você pode usar selecionar como subconsulta para fazer isso

UPDATE [table_name] SET [column_name] = (SELECT [column_name] FROM [table_name] WHERE [column_name] = [value]) WHERE [column_name] = [value];

consulta explicada em detalhes aqui http://www.voidtricks.com/mysql-update-from-select/


Você pode realmente fazer isso de duas maneiras:

Sintaxe de junção de atualização do 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

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

Escolha o que parecer mais natural para você.


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

Espero que funcione para voce.


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 ;

Espero que isso ajude você em um caso em que você precisa corresponder e atualizar entre duas tabelas.





sql-update