查找行,其中名称变体,但不是电子邮件地址

Posted

技术标签:

【中文标题】查找行,其中名称变体,但不是电子邮件地址【英文标题】:Finding rows, where Name variates, but not the mail adress 【发布时间】:2017-09-26 20:34:03 【问题描述】:

我有一个问题如下,我的脑子很烧。

想象一下下表(second_id 不重要,说我应该使用 unique() 在我的情况下不起作用)

create table adressen (

id int PRIMARY KEY AUTO_INCREMENT,
second_id int,
name char(64),
email char(64)
);

INSERT INTO adressen (second_id, name, email) VALUES ('1','max','max@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('1','peter','peter@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('1','emma','emma@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('2','max','max@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('2','peeter','peter@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('2','emma','emma@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('3','maax','max@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('3','elisa','elisa@test.com');
INSERT INTO adressen (second_id, name, email) VALUES ('3','eemmaa','emma@test.com');

如您所见,有多个用户使用相同的邮件,但名称不同。 我试图选择存在多个名称的所有邮件。

在这种情况下,它将是:

emma@test.com 具有两个不同的名称(emmaeemmaa

max@test.com 具有两个不同的名称(maxmaax

peter@test.com 具有两个不同的名称(peterpeeter

因此,每个“组”名称和邮件的输出应为 1 行,例如:

emma@test.com , emma
emma@test.com , eemmaa
max@test.com, max
max@test.com, maxx
petertest.com, peter
petertest.com, peeter

我不想获取邮件和姓名相同的行。如果我的表中只有一个条目(在本例中为 karl),我也不想获得一行

非常感谢您的帮助!

【问题讨论】:

假设表名是users:SELECT mail,name FROM users WHERE mail IN (SELECT mail FROM users GROUP BY mail HAVING COUNT(*) > 1) 您的示例中没有任何行与电子邮件和名称相同。如果您的意思是名称与电子邮件地址的本地部分相同,请edit您的问题指定。 @O.Jones 他的意思是它们都与另一行相同,例如第 7 行和第 8 行。 如果 id 9 不存在,emma 是否应该出现在结果中?即,您是否希望完全相同的重复项(没有多个不同的名称,但有多个行)出现在您的列表中? @Bohemian 不,如果 ID 9 被删除,则不应出现 emma。 【参考方案1】:

使用子查询查找具有多个不同name 的所有mail 值,并与表本身连接。

SELECT DISTINCT a.mail, a.name
    FROM tbl a
    JOIN (
              SELECT mail
                FROM tbl
               GROUP BY mail
              HAVING COUNT(DISTINCT name) > 1
         ) b ON a.mail = b.mail
   ORDER BY a.mail, a.name;

DEMO

这基于 O. Jones 的回答,但添加了 COUNT(DISTINCT name),因此具有相同名称和电子邮件的行不计为重复。

【讨论】:

现在它工作得非常好!感谢您的正确答案和快速回复!【参考方案2】:

首先获取包含重复电子邮件地址的结果集。

              SELECT mail
                FROM tbl
               GROUP BY mail
              HAVING COUNT(*) > 1

然后将其用作虚拟表并将其连接到您的详细信息表

  SELECT a.mail, a.name
    FROM tbl a
    JOIN (
              SELECT mail
                FROM tbl
               GROUP BY mail
              HAVING COUNT(*) > 1
         ) b ON a.mail = b.mail
   ORDER BY a.mail, a.name

您可以尝试像这样对结果集进行重复数据删除:

  SELECT DISTINCT a.mail, a.name
    FROM tbl a
    JOIN (
              SELECT mail
                FROM tbl
               GROUP BY mail
              HAVING COUNT(*) > 1
         ) b ON a.mail = b.mail
   ORDER BY a.mail, a.name

【讨论】:

这给了我一个表格,里面都是多封邮件,但仍然有重复的行,其中电子邮件和姓名是相同的。 试试HAVING COUNT(DISTINCT name) > 1,这样它就不会计算电子邮件和姓名相同的行。 @Barmar,在这种情况下没有输出 @SebaM 你能制作一个 sqlfiddle,或者将输入数据作为纯文本发布,以便我们复制和粘贴它吗? @Barmar 当然可以,但是我如何上传或发布它。评论太长了,抱歉没用过 sqlfiddle。【参考方案3】:

试试这个:

SELECT distinct mail,name FROM table 
      WHERE mail IN (SELECT mail FROM table GROUP BY mail HAVING COUNT(distinct name) > 1)
  order by mail,name;

希望对你有帮助!

【讨论】:

感谢您的回复,但这不是我想要的。与名称相比,@ 之前的部分无关紧要。 那你是什么意思:“我不想得到邮件和姓名相同的行。” 他的意思是它们都和另一行一样。 您需要HAVING COUNT(DISTINCT name) > 1,因此它不会将具有相同名称和电子邮件的行视为重复项。 您不能将DISTINCT 放在这样的选择列表的中间。 DISTINCT 适用于整个选择列表,而不是单个列。【参考方案4】:

灵感来自 O Jones 的答案和 cmets

这应该可以工作

SELECT DISTINCT a.mail, a.name
FROM tbl a
JOIN (
          SELECT mail
            FROM tbl
           GROUP BY mail
          HAVING COUNT(DISTINCT name) > 1
     ) b ON a.mail = b.mail
ORDER BY a.mail, a.name

【讨论】:

以上是关于查找行,其中名称变体,但不是电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用 AD 组名称查找 Active Directory 组电子邮件地址

Woocommerce:在购物车、订单确认和订单电子邮件中显示变体名称 [重复]

电子邮件地址的名称部分中的单引号是不是合法?

Facebook Graph Request 正在返回名称但不是电子邮件

从大型文档中提取电子邮件子字符串

电子邮件验证 MX 查找