更新除一之外的重复行

Pan*_*yar 1 mysql sql

我有一个名为的表simple_data,在名为 的列中有数百万个手机号码MSISDN,但它包含重复项。

所有行都有一个FLAG设置为零的列。

我想通过将FLAG值设置为2除一行来更新所有重复的行。

CREATE TABLE `wt_simple_data` (
  `SIMPLEID` int(10) NOT NULL AUTO_INCREMENT,
  `CAMPID` bigint(20) NOT NULL,
  `MSISDN` bigint(20) NOT NULL,
  `FLAG` enum('0','1','2') DEFAULT '0' COMMENT '0 FOR NOT SENT, 1 FOR SENT',
  PRIMARY KEY (`SIMPLEID`)

) ENGINE=InnoDB  DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)

一些示例数据:

SIMPLEID  CAMPID     MSISDN        FLAG    
 15        311      9874123411      0    
 16        311      9874123411      0    
 17        311      9874123411      0    
 18        311      9874123412      0    
 19        311      9874123412      0    
 20        311      9874123413      0    
 21        311      9874123413      0    
 22        311      9874123414      0
Run Code Online (Sandbox Code Playgroud)

我想要的结果

SIMPLEID  CAMPID     MSISDN        FLAG    
 15        311      9874123411      0    
 16        311      9874123411      2    
 17        311      9874123411      2    
 18        311      9874123412      0    
 19        311      9874123412      2    
 20        311      9874123413      0    
 21        311      9874123413      2    
 22        311      9874123414      0
Run Code Online (Sandbox Code Playgroud)

Abh*_*rty 5

您可以使用 JOIN 并将第一条记录保留为 0

update 
wt_simple_data w1 
join ( 
  select 
   min(SIMPLEID) as SIMPLEID,
   CAMPID,
   MSISDN 
   from wt_simple_data 
   group by CAMPID,MSISDN 
)w2 
on w1.SIMPLEID > w2.SIMPLEID 
and w1.CAMPID = w2.CAMPID 
and w1.MSISDN = w2.MSISDN 
set w1.FLAG = '2' 
Run Code Online (Sandbox Code Playgroud)