【问题标题】:Mysql Query: Find Customer W/Orders but without PaymentMysql 查询:查找有订单但没有付款的客户
【发布时间】:2012-02-12 04:18:28
【问题描述】:

正如标题所说,我正在尝试查找已下订单但尚未付款的客户。

我有三张桌子;

Customers, Payments, Orders

到目前为止,我的 sql 给了我(嵌套查询)所有没有付款的客户,然后外部查询尝试将所有客户与订单连接起来并检查这些客户是否不在我的内部表中?

SELECT customerWOpayments.customerNumber FROM 
ClassicModels.Customers c
INNER JOIN ClassicModels.Orders o ON c.customerName = o.customerNumber
NOT IN 
(SELECT  distinct c.customerNumber
FROM ClassicModels.Customers c
LEFT OUTER JOIN ClassicModels.Payments p ON c.customerNumber = p.customerNumber
WHERE p.customerNumber IS NULL) customerWOpayments;

我在第 8 行遇到 mysql 语法错误,但不知道为什么?

【问题讨论】:

    标签: mysql sql left-join inner-join inner-query


    【解决方案1】:

    这应该返回有订单但没有匹配付款的客户,假设您在原始示例中加入的所有键都是正确的(例如 c.customerName = o.customerNumber 似乎可疑)。

    SELECT c.customerNumber
    FROM ClassicModels.Customers c
      INNER JOIN ClassicModels.Orders o
        ON c.customerNumber = o.customerNumber
      LEFT OUTER JOIN ClassicModels.Payments p
        ON c.customerNumber = p.customerNumber
    WHERE p.customerNumber IS NULL;
    

    【讨论】:

    • 您对 c.customerName 的看法完全正确,这是一个错字,应该是 c.customerNumber。我正在尝试你的实现
    【解决方案2】:

    基本上你错过了WHERE 子句。你的问题缺乏信息。请提供您的桌子的Schema。谢谢!

    试试这个:

    你确定这个条件ON c.customerName = o.customerNumber

    SELECT customerWOpayments.customerNumber 
    FROM  ClassicModels.Customers c INNER JOIN ClassicModels.Orders o 
             ON c.customerName = o.customerNumber -- Please check this out
    WHERE o.customerNumber NOT IN 
        (SELECT  distinct c.customerNumber
        FROM ClassicModels.Customers c LEFT JOIN ClassicModels.Payments p 
                 ON c.customerNumber = p.customerNumber
        WHERE p.customerNumber IS NULL);
    

    OR 没有子查询

    SELECT a.*
    FROM Customers a INNER JOIN Orders b ON
            a.CustomerName = b.CustomerNumber -- Please check this line
         LEFT JOIN Payments c ON
            b.CustomerNumber = c.CustomerNumber
    WHERE c.CustomerNumber IS NULL
    

    我认为这是 a.CustomerName = b.CustomerNumber 的拼写错误,而不是 a.CustomerNumber = b.CustomerNumber

    我无法准确判断是不是因为您没有为您的表的schema 提供一些dummy records

    希望这会有所帮助。

    【讨论】:

    • @warz,你试过这个解决方案吗?第二个。
    • 我尝试了您的第二个解决方案,它是否按照预期进行。为帮助投票。
    【解决方案3】:

    与其他解决方案不同,当客户有多个订单时,此解决方案不会产生重复的客户编号。

    SELECT C.customerNumber 
    FROM ClassicModels.Customers C 
    WHERE 
    EXISTS(
        -- customer has orders
        SELECT * 
        FROM ClassicModels.Orders AS O
        WHERE O.customerNumber = C.customerNumber 
    )
    AND NOT EXISTS(
        -- customer does not have payments
        SELECT *
        FROM ClassicModels.Payments P
        WHERE P.customerNumber = C.customerNumber
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      相关资源
      最近更新 更多