Mysql 识别具有重复电子邮件的活动成员
我有一个表,其中包含超过20万条记录的竞选成员。 我们有一个问题,不同的联系人共享相同的电子邮件地址,但订阅不同的活动。我需要确定的是,有重复的电子邮件给另一个联系人,但没有订阅同一组活动的任何联系人。有100个不同的活动,联系人可能会订阅所有活动。该表包含许多字段,但我需要的相关字段包括可由多个联系人共享的电子邮件、唯一且区分大小写的联系人ID和唯一且区分大小写但可分配给多个联系人的活动IDMysql 识别具有重复电子邮件的活动成员,mysql,sql,Mysql,Sql,我有一个表,其中包含超过20万条记录的竞选成员。 我们有一个问题,不同的联系人共享相同的电子邮件地址,但订阅不同的活动。我需要确定的是,有重复的电子邮件给另一个联系人,但没有订阅同一组活动的任何联系人。有100个不同的活动,联系人可能会订阅所有活动。该表包含许多字段,但我需要的相关字段包括可由多个联系人共享的电子邮件、唯一且区分大小写的联系人ID和唯一且区分大小写但可分配给多个联系人的活动ID +----------------------+------------+------------+-
+----------------------+------------+------------+-----------+-------------+---------------+
| Email | Contact_ID | First_Name | Last_Name | Campaign_ID | Campaign_Name |
+----------------------+------------+------------+-----------+-------------+---------------+
| John@mail.com | 300ABC | John | Smith | 100xyz | Campaign 1 |
| Mary@mail.com | 300abc | Mary | Smith | 100wyz | Campaign 2 |
| JonesFamily@mail.com | 300Abc | Jim | Jones | 100xyz | Campaign 1 |
| JonesFamily@mail.com | 300Abc | Jim | Jones | 100Wyz | Campaign 3 |
| JonesFamily@mail.com | 300abC | Jane | Jones | 100xyz | Campaign 1 |
| JonesFamily@mail.com | 300abC | Jane | Jones | 100Wyz | Campaign 3 |
| JonesFamily@mail.com | 300abC | Jane | Jones | 100Ayz | Campaign 4 |
+----------------------+------------+------------+-----------+-------------+---------------+
例如,Jim和Jane Jones共享一个电子邮件地址并订阅了5个活动2相同,但Jane也订阅了活动4。我需要的脚本,以确定吉姆和简,因为他们共享一封电子邮件,但不订阅同一套活动。我们的最终目标是删除一个联系人的电子邮件地址,但确保他们订阅了所有活动。我认为您可以通过group_concat做到这一点:
子查询根据姓名获取给定联系人的活动列表;您可能有其他标准。外部查询然后选择活动不匹配的多人电子邮件。您以前使用过distinct、group by和having吗?特别是最后两个一起?我的SQL知识非常基础。我使用过DISTINCE和group by,但从未使用过。好的,我会稍等,有人会回答,否则我会问你如何识别联系人?仅根据姓名?我们使用联系人ID将联系人识别为该联系人的唯一联系人,其中不同联系人的名字和姓氏可能相同,在某些情况下,如果有同名的父子,他们甚至可以共享一个电子邮件地址Jim Jones email,Jim Jones email可能是两个人。Jim 2是Jim Jr.@drew说Jim Jones可能是不同的人,联系人id是唯一的标识符。但问题是,它需要区分大小写,因为根据表中的示例,组成ID的字符对于不同的联系人可能是相同的,只是有些是大写或小写。在这种情况下,单词选择不当@M.Milburn。事实上,这个词应该从英语中删除,因为说话人的意思是它应该很简单,去做吧,而听者是,哦,真的吗?我每天都会从中得到乐趣,因为我遇到了很多人:
select email, group_concat(firstname, ' ', lastname) as commonnames
from (select email, firstname, lastname,
group_concat(distinct campaign_id order by campaign_id) as campaigns
from table t
group by email, firstname, lastname
) en
group by email
having count(*) > 1 and min(campaigns) <> max(campaigns);