MySQL удаляет дубликаты данных на основе столбца

#mysql #mysql-error-1055

#mysql #mysql-ошибка-1055

Вопрос:

Я использую MySQL 5.7.13

В моей базе данных есть следующие записи, и я хочу отфильтровать записи на основе одного столбца (email_identifier). т. е. возвращать только одну запись в случае, если конкретный столбец имеет повторяющееся значение.

Я пытаюсь выполнить следующий запрос, но он выдает следующую ошибку

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

ОШИБКА 1055 (42000): выражение # 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 2G;
*************************** 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
  

Комментарии:

1. Можете ли вы опубликовать схему и информацию о «infinito_staging1.list_subscriber.id «это??

2. @cody123 добавил показать таблицу создания, дайте мне знать, если вам нужна какая-либо другая информация.

Ответ №1:

При выполнении group by вам нужно предоставить агрегатную функцию для каждого столбца, как еще MySQL может выбрать одно из двух разных значений?

Что вам следует сделать, если вы не хотите, чтобы электронная почта была уникальной в вашей таблице, так это сообщить об этом MySQL. Лучший способ — добавить уникальный индекс.

 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;
  

Это даст вам все эти электронные письма, а затем вам придется вручную удалять / объединять записи.

Комментарии:

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
  

Комментарии:

1. ОШИБКА 1055 (42000): выражение # 1 списка ВЫБОРА отсутствует в предложении GROUP BY и содержит неагрегированный столбец ‘db1.list_subscriber.id ‘ который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode=only_full_group_by