根据MySql中的条件值合并保留一些数据的重复记录

根据MySql中的条件值合并保留一些数据的重复记录,mysql,duplicates,Mysql,Duplicates,我有一个特殊的被骗问题。我可以很容易地识别记录,但我需要对一些伴随的数据进行本质上的合并 问题出在这里。我的桌子有点像这样: CREATE TABLE `People` ( `PersonId` int(11) NOT NULL AUTO_INCREMENT, `Address` varchar(255) DEFAULT NULL, `Title` varchar(50) DEFAULT NULL, `Forename` varchar(150) DEFAULT NULL,

我有一个特殊的被骗问题。我可以很容易地识别记录,但我需要对一些伴随的数据进行本质上的合并

问题出在这里。我的桌子有点像这样:

CREATE TABLE `People` (
  `PersonId` int(11) NOT NULL AUTO_INCREMENT,
  `Address` varchar(255) DEFAULT NULL,
  `Title` varchar(50) DEFAULT NULL,
  `Forename` varchar(150) DEFAULT NULL,
  `Surname` varchar(150) DEFAULT NULL,
  `FlagOne` bit(1) NOT NULL DEFAULT b'0',
  `FlagTwo` bit(1) NOT NULL DEFAULT b'0',
  `FlagThree` bit(1) NOT NULL DEFAULT b'0',
  PRIMARY KEY (`PersonId`)
)
重复记录仅在标题和标志值上不同-它们通过具有相同的地址、名字和姓氏字段被标识为重复记录:

PersonId    Address         Title   Forename    Surname FlagOne FlagTwo FlagThree
1           6 Smith Street  Mrs     Jane        Doe     1       0       0
2           6 Smith Street  Ms      Jane        Doe     0       1       0
我不知道如何将这两个合并到一个记录中,该记录保留了所有的积极标志。保留两个原始记录中的哪一个并不重要——使用PersonId来区分它们是可以的。所以,这是我们想要的结果:

PersonId    Address         Title   Forename    Surname FlagOne FlagTwo FlagThree
2           6 Smith Street  Ms      Jane        Doe     1       1       0

我知道如何基于连接进行更新,但我不确定如何实现获得此特定结果所需的条件?

您说过您知道如何使用连接进行更新,因此类似于以下内容的内容将提供合并:

 SELECT MAX(PersonId),
        Address,
        MAX(Title), 
        Forename,
        Surname
        MAX( FlagOne ),
        MAX( FlagTwo ), 
        MAX( FlagThree)
FROM People
GROUP BY Address,
         Forename,
         Surname
然后您需要删除重复项

DELETE People
WHERE PersonID IN (SELECT MIN(PersonId)
                   FROM People
                   GROUP BY Address,
                            Forename,
                            Surname
                   HAVING COUNT(*) > 1)

如果您有三行具有相同的名字、姓氏,则假定只有重复项。将需要一个不同的方法。

我认为您需要分两步进行:

1-更新de值:

Update People p
LEFT JOIN (
      SELECT MAX(PersonId) as PId,
            Address,
            MAX(Title) as title, 
            Forename,
            Surname
            MAX( FlagOne ) as FlagOne,
            MAX( FlagTwo ) as FlagTwo, 
            MAX( FlagThree) as Flagthree
    FROM People
    GROUP BY Address,
             Forename,
             Surname ) t

 ON t.Address = p.Address
AND t.Forename = p.Forename
AND t.Surname = p.Surname
SET p.FlagOne = t.FlagOne , 
    p.FlagTwo = t.FlagTwo , 
    p.FlagThree= t.FlagThree
WHERE p.PersonId = t.PId
2-删除:

DELETE p
 FROM People p
 INNER JOIN 
    People t ON t.Address = p.Address
                  AND t.Forename = p.Forename
                  AND t.Surname = p.Surname
 WHERE p.PersonId < t.PersonId 

我可以很容易地识别这些记录。。。。您如何知道这些是重复的行?个人识别码是differents@JuanCarlosOropeza在这种情况下,任何具有相同地址、名称和姓氏的记录都被视为重复记录。是否可以将删除重复的记录放入表的新副本中?或者您需要更新某些行并从现有表中删除其他行吗?我怀疑前者会更容易。相关问题:您是否需要保留现有的PersonId值?是否希望始终保持较高的PersonId值,如您的示例所示?@DanielE。不,保留哪一条记录无关紧要。谢谢你-我真傻,没有想到使用MAX.FYI。有一些情况下,此问题跨越3+行,但可以保留在原位。问题实际上并不影响功能,只影响存储空间。Daniel更新问题不需要许可。如果您发现缺少某些内容,请修复它。我认为连接轴错误,并且您错过了ON条件。您需要这样的东西,您的Delete语句对于两个以上的副本非常有效。但是您不需要左连接使用内部连接您是对的,因为删除内部连接会更好地工作。我删除一些评论