如何合并MySQL表中的重复行

如何合并MySQL表中的重复行,mysql,duplicates,Mysql,Duplicates,我几乎完成了一个涉及客户和产品的项目,最后才发现由于键入错误,我们有重复的记录,销售人员多次将同一客户添加到数据库中 我需要做的是通过比较客户名称和他们的邮政编码来识别重复记录,并合并产品,以便生成的更新产品字段与适用于他们的所有产品一致,但只存在一个客户记录 为了解释这一点,我举了一个小例子 DROP TABLE IF EXISTS `tblProducts`; CREATE TABLE `tblProducts` ( `ID` int(10) DEFAULT NU

我几乎完成了一个涉及客户和产品的项目,最后才发现由于键入错误,我们有重复的记录,销售人员多次将同一客户添加到数据库中

我需要做的是通过比较客户名称和他们的邮政编码来识别重复记录,并合并产品,以便生成的更新产品字段与适用于他们的所有产品一致,但只存在一个客户记录

为了解释这一点,我举了一个小例子

    DROP TABLE IF EXISTS `tblProducts`;
    CREATE TABLE `tblProducts` (
      `ID` int(10) DEFAULT NULL,
      `Customer` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
      `Postcode` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
      `Products` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

    INSERT INTO `tblProducts` VALUES ('1', 'Bradford', 'BR1 2HJ', '111&222&444');
    INSERT INTO `tblProducts` VALUES ('2', 'Bradford', 'BR1 2HJ', '222');
    INSERT INTO `tblProducts` VALUES ('3', 'Tanner', 'TE4 9PO', '777&333');
    INSERT INTO `tblProducts` VALUES ('4', 'Smythe', 'SM3 8KO', '111&222');
    INSERT INTO `tblProducts` VALUES ('5', 'Francis', 'FL2 6HG', '444&333');
    INSERT INTO `tblProducts` VALUES ('6', 'Tanner', 'TE4 9PO', '555');
    INSERT INTO `tblProducts` VALUES ('7', 'Peters', 'PE4 4PE', '444');
    INSERT INTO `tblProducts` VALUES ('8', 'Jeffrey', 'JE9 4JK', '444&555&888');
    INSERT INTO `tblProducts` VALUES ('9', 'Barnes', 'BA5 5AB', '999');
    INSERT INTO `tblProducts` VALUES ('10', 'Smythe', 'SM1 4GE', '888&777&222');
如果我们运行下面的查询,您将看到我们有两个副本,用于Bradford和Tanner

    SELECT Customer, Postcode, COUNT(*) FROM tblProducts group by Customer, Postcode having count(*) > 1

    Customer    Postcode    COUNT(*)
    Bradford    BR1 2HJ     2
    Tanner      TE4 9PO     2
单独的重复记录包括:

    Customer  Postcode  Products
    Bradford  BR1 2HJ   111&222&444
    Bradford  BR1 2HJ   222
    Tanner    TE4 9PO   777&333
    Tanner    TE4 9PO   555
我需要运行一个MySQL查询来“合并客户和邮政编码计数>1的产品”,如上所述,因此最终结果将是:

    Customer  Postcode  Products
    Bradford  BR1 2HJ   111&222&444
    Tanner    TE4 9PO   777&333&555
注意,第一条记录中只有一个222的实例,因为222已经存在。将从MySQL表中删除重复记录,以便只存在一条记录

我必须承认,我认为MySQL很容易做到这一点,并且花了很长时间研究合并行、合并字段、删除重复项,但没有发现任何特别有用的东西

链接到JSFIDLE(如果有帮助):

有人能帮我一下吗,我卡住了

非常感谢,

抢劫


你可以试试上面的查询。

你应该规范化数据库。哇,我印象深刻。不过,我唯一的补充问题是,这是一个选择,而不是一个更新,因此就我所知,它实际上并没有更新表以删除重复行?@RobWassell如果您想删除重复行,那么您可以在这里进行检查,我一直在测试,但这并不像预期的那样有效。它通过获取第一条记录并忽略重复记录来消除重复记录,但不会合并Products字段中的值。与预期相反:Bradford BR1 2HJ 111&222&444 Tanner TE4 9PO 777&333&555收到以下信息:Bradford BR1 2HJ 111&222&444 Tanner TE4 9PO 777&333注意,尚未合并Tanner的产品。接受第一个值并丢弃第二个值是相对容易的部分,但尝试合并唯一值是我真正陷入困境的地方。
SELECT TP.Customer,TP.Postcode,TP.Products
FROM tblProducts TP
INNER JOIN
(
    SELECT MIN(ID) ID FROM tblProducts GROUP BY Customer, Postcode
)INNERTABLE  ON INNERTABLE.ID=TP.ID