2

我有以下 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
---------------------------------------------------------------------------

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

4

1 回答 1

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 子句中,否则有效地将外连接变为内连接

请注意,您的使用GROUP BY既是有缺陷的,也是不必要的。

于 2016-02-24T02:24:59.037 回答