mysql - 与 MySQL NOT EXISTS 作斗争

标签 mysql sql database

我正在尝试查询我们的数据库以提取客户数据。关键部分是:

提取所有未购买product_a的客户/订单。

这将列出已购买product_b、product_c 和product_d 的客户/订单。

但它需要确保客户从未购买过product_a。我需要排除它们。

这是处理 NOT EXISTS 的正确方法吗?我仍然觉得其中包含一些购买了product_a的记录。

SELECT
    *
FROM
    orders
JOIN customers AS cus ON orders.CustomerNumber = cus.CustomerNumber
WHERE
    product != 'product_a'
OR (
    HomeTelephone = ''
    AND MobileTelephone != ''
)
AND NOT EXISTS  (
    SELECT
        OrderNumber
    FROM
        orders AS o
    JOIN customers AS c ON o.CustomerNumber = c.CustomerNumber
    WHERE
        c.EmailAddress = cus.EmailAddress
    AND Product = 'product_a'
    AND completed = 1
)
ORDER BY
    orderdate

如果没有 NOT EXISTS 语句,即使客户单独购买了product_a,也可以包含客户记录,对吗?

最佳答案

Your Not Exists 有点不对劲,where Product != 'product_a' 是多余的。

SELECT
    *
FROM

    orders AS o1
    JOIN customers AS cus ON o1.CustomerNumber = cus.CustomerNumber
WHERE
    cus.HomeTelephone = ''
    AND cus.MobileTelephone != ''
    AND NOT EXISTS  (
        SELECT 
            1 
        FROM 
            orders o2
        WHERE
            o2.CustomerNumber = cus.CustomerNumber 
            AND Product = 'product_a'
            AND completed = 1
    )
ORDER BY
    o1.orderdate

这将为您提供客户的订单。不过,根据您的描述,如果您只需要客户信息,则可以在查询的第一部分中排除对订单的联接,并使用“不存在”来确定该客户是否购买了product_a。

SELECT
    *
FROM
    customers cus
WHERE
    HomeTelephone = ''
    AND MobileTelephone != ''
    AND NOT EXISTS  (
        SELECT 
            1 
        FROM 
            orders o
        WHERE
            o.CustomerNumber = cus.CustomerNumber 
            AND Product = 'product_a'
            AND completed = 1
    )

关于mysql - 与 MySQL NOT EXISTS 作斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32952520/

相关文章:

mysql - MySQL innodb 中所有数据库的校验和

mysql - 使用嵌套 select 语句优化 MySQL 查询?

带逗号的 MySQL LIKE 子句

mysql - 在 mysqlWB 中同步我的模型时出错

sql - 如何检测和删除仅包含空值的列?

sql - PostgreSQL 复合主键和序列增量?

mysql - 使用外键链接两个表,其中一个表包含图像,另一个表包含用户信息

mysql - 无法在 MySQL 查询中找到最大平均值

php - MySQL 查询未正常运行

MySQL数据库运行在内存中以加速查询的执行