查找行,其中名称变体,但不是电子邮件地址
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
具有两个不同的名称(emma
、eemmaa
)
max@test.com
具有两个不同的名称(max
、maax
)
peter@test.com
具有两个不同的名称(peter
、peeter
)
因此,每个“组”名称和邮件的输出应为 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:在购物车、订单确认和订单电子邮件中显示变体名称 [重复]