我有以下 MySQL 查询。
SELECT
login,
firstname,
lastname,
email
FROM
xcart_customers
WHERE
login LIKE 'anonymous%'
AND email NOT IN (
SELECT
email
FROM
xcart_customers AS cx
WHERE
cx.login NOT LIKE 'anonymous%'
)
GROUP BY
email;
基本上有两组客户,有登录名的客户,以及所有以“anonymous%”登录名开头的匿名客户。
我正在尝试从列表中删除与匿名用户具有相同电子邮件地址的非匿名用户。
我认为上述查询会起作用,但我仍然得到一些与非匿名用户匹配的电子邮件地址。
login | firstname | lastname | email
---------------------------------------------------------------------------
anonymous-10 | Eric | Byorn | byorn@mail.com
---------------------------------------------------------------------------
some_user_name | Eric | Byorn | byorn@mail.com
---------------------------------------------------------------------------
所以我试图解决所有匿名用户,他们只出现在匿名结果中。
最佳答案
最有效、最优雅的解决方案是使用外部连接:
SELECT
a.login,
a.firstname,
a.lastname,
a.email
FROM xcart_customers a
LEFT JOIN xcart_customers b ON b.email = a.email
AND b.login NOT LIKE 'anonymous%'
WHERE a.login LIKE 'anonymous%'
AND b.email IS NULL
这里有两个关键技巧:
- 因为遗漏的 LEFT JOIN 返回左联接表中的所有 NULL,WHERE 子句排除 具有匹配项的行
- 所有 连接表上的条件(即使是非键)必须在连接条件中,即不在WHERE子句中,否则才能有效地转外连接进入内心
请注意,您对 GROUP BY
的使用既有缺陷又不必要。
关于mysql - 从结果集中删除可能包含相同电子邮件地址的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35570895/