MySQL – 基于SELECT查询的UPDATE查询

我需要检查(从同一张表)是否有基于date时间的两个事件之间的关联。

一组数据将包含特定事件的结束date – 时间,另一组数据将包含其他事件的开始date – 时间。

如果第一个事件在第二个事件之前完成,那么我想链接它们。

我到目前为止是:

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 

然后我join他们:

 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字段,运行一个UPDATE查询与SELECT嵌套?

实际上你可以通过以下两种方法中的一种来实现

MySQL更新连接语法:

 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语法:

 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) 

挑你看起来最自然的一个。

 UPDATE table1 dest, (SELECT * FROM table2 where id=x) 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 

Traaa! 这很好用!

有了上面的理解,你可以修改设置字段和“开”标准来完成你的工作。 您也可以执行检查,然后将数据拖到临时表中,然后使用上述语法replace您的表和列名称来运行更新。

希望它的作品,如果不让我知道。 我会为你写一个精确的查询。

  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 ; 

希望这将有助于你的情况下,你必须匹配和更新两个表。

我发现这个问题寻找我自己的解决scheme,以非常复杂的联接。 这是一个替代解决scheme,更复杂的问题,我认为可能是有用的。

我需要在活动表中填充product_id字段,其中活动在单元中进行编号,并且单元在一个级别中进行编号(使用stringN标识),以便可以使用SKU标识活动,即L1U1A1。 这些SKU然后被存储在不同的表中。

我确定了以下内容来获取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) 

我发现这太复杂了,不能在mysql中joinSELECT,所以我创build了一个临时表,并且用update语句join:

 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 [table1_name] AS t1 INNER JOIN [table2_name] AS t2 ON t1.column1_name] = t2.[column1_name] SET t1.[column2_name] = t2.column2_name]; 

按照这里了解如何使用此查询http://www.voidtricks.com/mysql-inner-join-update/

或者你可以使用select作为子查询来做到这一点

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

查询在这里详细解释http://www.voidtricks.com/mysql-update-from-select/

 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]; 

您可以使用:

 UPDATE Station AS st1, StationOld AS st2 SET st1.already_used = 1 WHERE st1.code = st2.code 

对于同一张桌子,

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