Mysql 查找行,其中名称可变,但邮件地址不可变

Mysql 查找行,其中名称可变,但邮件地址不可变,mysql,sql,Mysql,Sql,我有一个如下的问题,让我的心非常难受 假设下表第二个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'); INS

我有一个如下的问题,让我的心非常难受

假设下表第二个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用两个不同的名字emma,Eemma

max@test.com用两个不同的名字max,maax

peter@test.com有两个不同的名字彼得,皮特

因此,每组姓名和邮件的输出应为1行,如:

emma@test.com , emma
emma@test.com , eemmaa
max@test.com, max
max@test.com, maxx
petertest.com, peter
petertest.com, peeter
我不想得到邮件和姓名相同的行。另外,如果我的表中只有一个karl条目,我也不想得到一行


非常感谢你的帮助

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

              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
试试这个:

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;

希望有帮助

使用子查询查找具有多个不同名称的所有邮件值,并与表本身联接

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;

这是基于O.Jones的答案,但添加了COUNTDISTINCT名称,以便具有相同名称和电子邮件的行不会被视为重复行。

受O.Jones答案和注释的启发

这应该行得通

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

假设表名为users:SELECT mail,name FROM users WHERE mail IN SELECT mail FROM users GROUP BY mail have COUNT*>1您的示例中没有任何电子邮件和名称相同的行。如果您的意思是名称与电子邮件地址的本地部分相同,请在您的问题中指定。@O.Jones他的意思是它们都与另一行相同,如第7行和第8行。如果没有id 9,emma是否应该出现在结果中?ie是否希望在列表中显示没有多个不同名称但有多行的完全重复的邮件?@Bohemian否,如果ID 9被删除,emma不应该出现。这给了我一个表,其中有多封邮件,但仍有重复的行,其中电子邮件和名称相同。请尝试使用COUNTDISTINCT name>1,所以它不计算电子邮件和名称都相同的行数。@Barmar,在本例中没有output@SebaM你能制作一个sqlfiddle,或者将输入数据以纯文本形式发布,以便我们可以复制和粘贴它吗?@Barmar当然可以,但我如何上传或发布它呢。评论太长了,很抱歉从来没有用过sqlfiddle。谢谢你的回复,但这不是我想要的。这不是关于@前面的部分与名称的比较。那么你的意思是:我不想得到邮件和名称相同的行。他的意思是它们都与另一行相同。你需要COUNTDISTINCT name>1,因此,它不计算具有相同名称和电子邮件的行作为重复。在这样的选择列表中,你不能把区别放在中间。DISTINCT应用于整个选择列表,而不是单个列。现在它工作得非常好!谢谢你的正确答案和快速回复!