如何合并 MySQL 表中的重复行

Posted

技术标签:

【中文标题】如何合并 MySQL 表中的重复行【英文标题】:How to merge duplicates rows in a MySQL table 【发布时间】:2017-08-01 08:31:41 【问题描述】:

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

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

为了说明这一点,我整理了一个小例子。

    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 来说很容易实现,并且花了很长时间研究合并行、合并字段、删除重复项,但没有找到任何似乎特别有用的东西。

如果有帮助,请链接到 jsfiddle:http://sqlfiddle.com/#!9/966550/4/0

任何人都可以帮助我,因为我被卡住了。

非常感谢,

罗伯

【问题讨论】:

你应该规范化数据库。 【参考方案1】:
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

你可以试试上面的查询。

【讨论】:

哇,我印象深刻。我唯一的附加问题是这是一个 SELECT 而不是 UPDATE 所以它实际上并没有更新表以删除重复项? @RobWassell 如果你想删除重复的行,那么你可以在这里查看***.com/questions/4685173/… 我一直在测试,但这并没有按预期工作。它确实通过获取第一条记录并忽略重复记录来消除重复记录,但它不会合并 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 的产品。取第一个值并丢弃第二个值是相对容易的部分,但尝试合并唯一值是我真正陷入困境的地方。

以上是关于如何合并 MySQL 表中的重复行的主要内容,如果未能解决你的问题,请参考以下文章

Mysql - 获取同一表中的行交集[重复]

MySQL - 使用另一个表中的列排序行并且不重复数据

为mysql中的每个查询结果在表中插入行[重复]

如何合并重复行并将所有 False 值更改为 True,其中 True 是重复行中的值?

如何合并熊猫中的重复行?

如何删除表中的重复行[重复]