[mysql] MySQL-SELECT 쿼리 기반 업데이트 쿼리

날짜-시간을 기준으로 두 이벤트 사이에 연관성이 있는지 확인하려면 (같은 테이블에서) 확인해야합니다.

한 데이터 세트에는 특정 이벤트의 종료 날짜 시간이 포함되고 다른 데이터 세트에는 다른 이벤트의 시작 날짜 시간이 포함됩니다.

첫 번째 이벤트가 두 번째 이벤트 전에 완료되면 이벤트를 연결하고 싶습니다.

내가 지금까지 가지고있는 것은 :

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

그런 다음 그들과 합류합니다.

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

그런 다음 validation_check 필드를 기반으로 SELECT 중첩 된 UPDATE 쿼리를 실행할 수 있습니까?



답변

실제로 다음 두 가지 방법 중 하나를 수행 할 수 있습니다.

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

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)

가장 자연스러워 보이는 것을 선택하십시오.


답변

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

이것이 효과가 있기를 바랍니다.


답변

MySQL에서 쉬움 :

UPDATE users AS U1, users AS U2
SET U1.name_one = U2.name_colX
WHERE U2.user_id = U1.user_id


답변

누군가가 어떤 테이블을 대상으로하든 관계없이 한 데이터베이스에서 다른 데이터베이스로 데이터를 업데이트하려는 경우 몇 가지 기준이 있어야합니다.

이것은 모든 수준에서 더 좋고 깨끗합니다.

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 

트라 아! 잘 작동합니다!

위의 이해를 통해 작업을 수행하기 위해 설정된 필드와 “설정”기준을 수정할 수 있습니다. 검사를 수행 한 다음 임시 테이블로 데이터를 가져온 다음 테이블과 열 이름을 바꾸는 위의 구문을 사용하여 업데이트를 실행할 수도 있습니다.

알려지지 않으면 작동하기를 바랍니다. 나는 당신을 위해 정확한 질문을 쓸 것입니다.


답변

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 ;

두 테이블을 일치시키고 업데이트 해야하는 경우 이것이 도움이되기를 바랍니다.


답변

이 질문은 매우 복잡한 조인에 대한 내 자신의 솔루션을 찾는 데 있습니다. 이것은 더 복잡한 버전의 문제에 대한 대안 솔루션이며 유용하다고 생각했습니다.

액티비티 테이블에서 product_id 필드를 채워야하는데, 액티비티는 단위로 번호가 매겨지고 단위는 레벨 (문자열 ?? N로 식별)로 번호가 매겨져 SKU, 즉 L1U1A1을 사용하여 액티비티를 식별 할 수 있습니다. 그런 다음 해당 SKU는 다른 테이블에 저장됩니다.

activity_id와 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)

나는 그것이 mysql 내의 SELECT에 통합하기에는 너무 복잡하다는 것을 알았으므로 임시 테이블을 만들고 그것을 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;

누군가가 이것을 유용하게 사용하기를 바랍니다.


답변

UPDATE [table_name] AS T1,
      (SELECT [column_name]
        FROM [table_name]
        WHERE [column_name] = [value]) AS T2
  SET T1.[column_name]=T2.[column_name] + 1
WHERE T1.[column_name] = [value];