2016-10-04 77 views
0

我使用的是MySQL 5.7.13的MySQL删除基于列的重复数据

我已经在我的数据库以下记录,我想单列的基础上(email_identifier上过滤掉记录)。即在特定列具有重复值的情况下仅返回单个记录。

我想下面的查询,但它抛出以下错误

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

ERROR 1055(42000):表达SELECT列表中的#1是不是在GROUP BY子句中包含非聚合列 'db1.list_subscriber.id'这在功能上不依赖于GROUP BY子句中的列;这是不符合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: [email protected] 
      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":"[email protected]"} 
       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: [email protected] 
      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":"[email protected]"} 
       created_at: 2016-07-08 15:34:49 
       updated_at: 2016-08-11 14:55:52 
       deleted_at: NULL 

UPDATE

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 
+0

你可以发布架构和信息“inf inito_staging1.list_subscriber.id“这个? – cody123

+0

@ cody123增加了show create table,让我知道你是否需要其他信息。 –

回答

0

在做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; 

这会给你所有的电子邮件,那么你就必须手动删除/合并的记录。

+0

我不能使任何列唯一,另外重复检查可以在任何列上,我必须通过查询来做到这一点。 –

0

关于GROUP BY:

例如:

select a, b,c from abc group by a 

在这种情况下,你需要添加聚合功能列B和C 也许你可以柱B和C添加到组 like:

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

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