0

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
4

2 に答える 2

0

グループ化について:

例えば:

select a, b,c from abc group by a

この状況では、列 b と cに集計関数を追加する必要があります。おそらく、列 b と c を次のようにグループ化するために追加できます。

select a,b,c from group by a, b, c
于 2016-10-04T06:32:53.157 に答える
0

各列に集計関数を提供するgroup by必要がある場合、MySQL が 2 つの異なる値から 1 つを選択するにはどうすればよいでしょうか?

メールがテーブル内で一意であることを強制したくない場合にすべきことは、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;

これにより、これらすべてのメールが提供され、手動でレコードを削除/マージする必要があります。

于 2016-10-04T06:23:16.663 に答える