MySQL根据列删除重复数据

Posted

技术标签:

【中文标题】MySQL根据列删除重复数据【英文标题】:MySQL remove duplicate data based on a column 【发布时间】:2017-02-12 03:08:15 【问题描述】:

我使用的是 mysql 5.7.13

我的数据库中有以下记录,我想根据单列(email_identifier)过滤掉记录。即,如果特定列具有重复值,则仅返回单个记录。

我正在尝试以下查询,但它会引发以下错误

mysql> select * from list_subscriber where list_master_id = 202 group by email_identifier;

错误 1055 (42000):SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“db1.list_subscriber.id”;这与 sql_mode=only_full_group_by 不兼容

理想情况下,上述查询应该只返回 1 条记录,并且包含所有列

请建议我怎样才能做到这一点?

数据库行示例

mysql> select * from list_subscriber where list_master_id = 202 limit 2\G;
*************************** 1. row ***************************
                         id: 30518899
             list_master_id: 202
          unique_identifier: A
           email_identifier: xyz@yahoo.co.in
          mobile_identifier: 9195423432432
alternate_mobile_identifier: 
          region_identifier: 
            city_identifier: 
         country_identifier: 
             age_identifier: 
          gender_identifier: 
                   raw_data: "user":"A","number":"919542342423","msg":"msg3","emailid":"xyz@vfirst.com"
                 created_at: 2016-07-08 15:33:24
                 updated_at: 2016-08-11 14:55:52
                 deleted_at: NULL
*************************** 2. row ***************************
                         id: 30518901
             list_master_id: 202
          unique_identifier: J
           email_identifier: xyz@vfirst.com
          mobile_identifier: 919540077166
alternate_mobile_identifier: 
          region_identifier: 
            city_identifier: 
         country_identifier: 
             age_identifier: 
          gender_identifier: 
               raw_data: "user":"J","number":"919540077166","msg":"msg4","emailid":"xyz@vfirst.com"
                 created_at: 2016-07-08 15:34:49
                 updated_at: 2016-08-11 14:55:52
                 deleted_at: NULL

更新

CREATE TABLE `list_subscriber` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`list_master_id` int(10) unsigned NOT NULL,
`unique_identifier` varchar(512) COLLATE utf8_unicode_ci NOT NULL,
`email_identifier` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`mobile_identifier` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`alternate_mobile_identifier` varchar(255) COLLATE utf8_unicode_ci NOT   NULL,
`region_identifier` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`city_identifier` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`country_identifier` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`age_identifier` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`gender_identifier` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`raw_data` longtext COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `list_subscriber_list_master_id_foreign` (`list_master_id`),
CONSTRAINT `list_subscriber_list_master_id_foreign` FOREIGN KEY    (`list_master_id`) REFERENCES `list_master` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
)   ENGINE=InnoDB AUTO_INCREMENT=66956432 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

【问题讨论】:

你能发布关于“infinito_staging1.list_subscriber.id”的架构和信息吗?? @cody123 添加了显示创建表,如果您需要任何其他信息,请告诉我。 【参考方案1】:

在执行group by 时,您需要为每一列提供aggregate function,否则MySQL 怎么能从两个不同的值中选择一个?

如果您不想强制电子邮件在您的表中是唯一的,那么您应该做的就是告诉 MySQL。最好的方法是add a unique index。

alter table list_subscriber add unique key unique_email (email_identifier);

如果您的表中已有重复项,这可能会失败。查找所有重复的电子邮件运行

select email_identifier, count(1) as cnt from list_subscriber group by email_identifier having cnt > 1;

这将为您提供所有这些电子邮件,然后您必须手动删除/合并记录。

【讨论】:

我不能使任何列唯一,另外可以对任何列进行重复检查,我只能通过查询来完成。【参考方案2】:

关于分组:

例如:

select a, b,c from abc group by a

在这种情况下,您需要在 b 列和 c 列中添加聚合函数 可能您可以将列 b 和 c 添加到分组方式,例如:

select a,b,c from group by a, b, c

【讨论】:

ERROR 1055 (42000):SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列“db1.list_subscriber.id”,它在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容

以上是关于MySQL根据列删除重复数据的主要内容,如果未能解决你的问题,请参考以下文章

使用单个重复列从 MySQL 数据库中删除重复项 [重复]

从 mySQL 数据库中删除列重复的重复行

根据一列删除重复项并根据另一表中的数据进行过滤

Mysql根据一张表俩个字段删除重复数据

根据条件对 BigQuery 中的行进行重复数据删除

如何根据两列删除所有重复行?