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;