Mysql 从可能包含相同电子邮件地址的结果集中删除行

Mysql 从可能包含相同电子邮件地址的结果集中删除行,mysql,x-cart,Mysql,X Cart,我有以下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 'an

我有以下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
---------------------------------------------------------------------------
我原以为上面的查询会起作用,但我仍然收到一些与非匿名用户匹配的电子邮件地址

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
这里有两个关键技巧:

  • 由于未命中的左联接将返回左联接表中的所有空值,因此WHERE子句将排除具有匹配项的行
  • 联接表上的所有条件(甚至非键)都必须在联接条件中,即不在WHERE子句中,否则将有效地将外部联接转换为内部联接


  • 请注意,您对
    分组依据的使用既有缺陷也没有必要。

    您可以共享一些数据吗?好的,添加示例数据@shmoselYour查询返回0行示例数据。你能举一个意外结果的例子吗?除了我在结果中仍然得到重复的电子邮件地址,如果同一个结帐客户有多个匿名行。你没有说任何关于重复的内容。
    选择DISTINCT…
    有效吗?如果没有,请提出一个新问题(因为此问题已得到回答)