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

时间:2016-02-23 07:04:14

标签: 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 'anonymous%'
)
GROUP BY
    email;

基本上有两组客户,即拥有登录权限的客户,以及所有以“匿名%”登录信息开头的匿名客户。

我正在尝试从列表中删除与匿名用户具有相同电子邮件地址的非匿名用户。

我认为上述查询会有效,但我仍然会收到一些与非匿名用户匹配的电子邮件地址。

login           |  firstname     |   lastname     |   email
---------------------------------------------------------------------------
anonymous-10    |  Eric          |   Byorn        |   byorn@mail.com
---------------------------------------------------------------------------
some_user_name  |  Eric          |   Byorn        |   byorn@mail.com
---------------------------------------------------------------------------

所以我试图解决所有匿名用户,他们只出现在匿名结果中。

1 个答案:

答案 0 :(得分:1)

最有效,恕我直言的优雅解决方案是使用外部联接:

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

这里有两个关键技巧:

  1. 由于错过的LEFT JOIN会返回左连接表中的所有NULL,因此WHERE子句排除了 匹配的
  2. 连接表上的所有条件(甚至非键)必须处于连接条件,即WHERE子句中的,否则有效地转换外连接进入一个内在的
  3. 请注意,您使用GROUP BY既有缺陷也没必要。