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

标签 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;

基本上有两组客户,有登录名的客户,以及所有以“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

这里有两个关键技巧:

  1. 因为遗漏的 LEFT JOIN 返回左联接表中的所有 NULL,WHERE 子句排除 具有匹配项的行
  2. 所有 连接表上的条件(即使是非键)必须在连接条件中,即在WHERE子句中,否则才能有效地转外连接进入内心

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

关于mysql - 从结果集中删除可能包含相同电子邮件地址的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35570895/

相关文章:

php - 优化 SQL 查询

php - libCURL::SSL:证书主题名称 'Common Name (eg, YOUR name)' 与目标主机名不匹配...但 CN 和目标名称匹配

paypal - 客户被重定向回结帐页面而不是订单确认页面

seo - 允许抓取外部 Javascript 文件

PHP、x-cart、潜在的安全漏洞

php - num_rows 删除查询 codeigniter

mysql - 如何合并 2 个表中的 3 个查询。(确定日期的最小行差异并显示 2 个表中的所有字段)

php - 无法使用 HTACCESS 创建漂亮的 url

mysql - Laravel 模型在查询中引用错误的表