Mysql update inner join

Posted zhangzhiping35

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql update inner join相关的知识,希望对你有一定的参考价值。

一:需求
A表和B表的表结构相同,A表是历史表,B表是增量数据表;想要根据关联条件更新A表中的数据。

二:表结构
CREATE TABLE `A` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `bid` bigint(20) NOT NULL ,
  `sid` bigint(20) NOT NULL ,
  `grid` bigint(20) NOT NULL ,
  `age` bigint(20) NOT NULL ,
  `pv` bigint(20) NOT NULL ,
  `uv` bigint(20) NOT NULL ,
  `pay_count` bigint(20) NOT NULL,
  `charge_amount` bigint(20) NOT NULL ,
  `last_pay_count` bigint(20) NOT NULL ,
  `last_charge_amount` bigint(20) NOT NULL ,
  `ftime` bigint(20) NOT NULL ,
  `dtime` bigint(20) NOT NULL DEFAULT ‘0‘ COMMENT ‘详细时间(yyyyMMddHH)‘
  PRIMARY KEY (`id`,`ftime`),
  KEY `IX_FTIME` (`ftime`) USING BTREE,
  KEY `IX_HTIME` (`htime`) USING BTREE,
  KEY `IX_DTIME` (`dtime`),
  KEY `IX_B_F_S_G` (`bid`,`ftime`,`sid`,`grid`),
  KEY `IX_B_S_G` (`bid`,`sid`,`grid`),
  KEY `IX_B_D_S` (`bid`,`dtime`,`sid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
注意:mysql 只有2种索引(BTREE 和 HASH)

三:注意
1、只更新A表的部分字段:pv、uv和pay_amount

2、确定唯一一条记录的关联字段是:bid、sid、dtime、qrid

 

四:实现
1、使用inner join实现

UPDATE A as aa
INNER JOIN B as bb ON bb.bid = aa.bid
AND bb.sid=aa.sid
AND bb.grid=aa.grid
SET aa.pv=bb.pv,
aa.uv=bb.uv,
aa.pay_amount=bb.pay_amount
WHERE aa.dtime=?
AND aa.bid=? ;
2、使用exists实现

UPDATE A aa
SET aa.pv = (SELECT bb.pv
FROM B bb
WHERE bb.bid = aa.bid
AND bb.sid = aa.sid
AND bb.grid = aa.grid),
aa.uv = (SELECT bb.uv
FROM B bb
WHERE bb.bid = aa.bid
AND bb.sid = aa.sid
AND bb.grid = aa.grid),
aa.pay_amount = (SELECT bb.pay_amount
FROM B bb
WHERE bb.bid = aa.bid
AND bb.sid = aa.sid
AND bb.grid = aa.grid)
WHERE EXISTS (SELECT 1
FROM B bb
WHERE bb.bid = aa.bid
AND bb.sid = aa.sid
AND bb.grid = aa.grid)
AND aa.dtime = ?
AND aa.bid = ?;

以上是关于Mysql update inner join的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server 与 MySql 在使用 update inner join 时的区别

update inner join set 和 update set from ,如何使用一个表中的字段更新另一个表中字段,MySQL和SqlServer不一样

使用基于另一个填充表的INNER JOIN UPDATE语句更新空表

MySQL 连接的使用:语法及案例剖析INNER JOINLEFT JOINRIGHT JOIN

Mysql 连接(left join, right join, inner join ,full join)

sql update__inner.sql