MySQL-基于SELECT查询的UPDATE查询

我须要检查(从同一张表)基于日期时间的两个事件之间是否存在关联。 mysql

一组数据将包含某些事件的结束日期时间,另外一组数据将包含其余事件的开始日期时间。 web

若是第一个事件在第二个事件以前完成,那么我想将它们连接起来。 sql

到目前为止,我有: 数据库

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

而后我加入他们: spa

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查询吗? code


#1楼

若是有人试图将数据从一个数据库更新到另外一个数据库,而不管他们针对的是哪一个表,那么都必须有一些标准。 事件

这对全部级别的人来讲都是更好和干净的: ip

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

特拉! 效果很好! 字符串

基于以上理解,您能够修改设置字段和“启用”条件来进行工做。 您还能够执行检查,而后将数据拉入临时表,而后使用上述语法替换表名和列名来运行更新。 get

但愿它能奏效,若是不能让我知道。 我会为您写一个确切的查询。


#2楼

您实际上能够经过如下两种方式之一执行此操做:

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)

选择最适合您的那个。


#3楼

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

但愿这对您有用。


#4楼

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 ;

但愿这对您必须在两个表之间进行匹配和更新的状况有所帮助。


#5楼

我在寻找本身的很是复杂的联接解决方案时发现了这个问题。 这是该问题的更复杂版本的替代解决方案,我认为这多是有用的。

我须要在活动表中填充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;

我但愿有人以为这有用