【问题标题】:Mysql query issue with left join左连接的Mysql查询问题
【发布时间】:2017-03-20 10:14:16
【问题描述】:

以下是我的查询:

SELECT 
    u.id, 
    CONCAT(u.FirstName, ' ', u.LastName) as customer, 
    u.MobileNumber, 
    u.EmailId, 
    (
        pmt.TotalCreditedAmt - trns.TotalDeductAmt
    ) as available_balance, 
    DATE_FORMAT(i.InvoiceDate, '%Y/%m/%d') as InvoiceDate, 
    pmt.TotalCreditedAmt, 
    trns.TotalDeductAmt 
FROM 
    (`Users` as u) 
    INNER JOIN (
        SELECT 
            Max(InvoiceDate) AS InvoiceDate, 
            Customer_id 
        FROM 
            Invoice 
        GROUP BY 
            Customer_id
    ) as i ON `i`.`Customer_id` = `u`.`Id` 
    LEFT JOIN (
        SELECT 
            sum(CreditedAmount) AS TotalCreditedAmt, 
            UserId 
        FROM 
            Payment 
        where 
            PaymentSucc = "Yes" 
        GROUP BY 
            UserId
    ) as pmt ON `pmt`.`UserId` = `u`.`id` 
    LEFT JOIN (
        SELECT 
            sum(Amount) AS TotalDeductAmt, 
            UserId 
        FROM 
            Transaction 
        GROUP BY 
            UserId
    ) as trns ON `trns`.`UserId` = `u`.`id` 
WHERE 
    `u`.`UserType` = 'User' 
    AND `pmt`.`TotalCreditedAmt` - trns.TotalDeductAmt < '0' 
ORDER BY 
    `u`.`EmailId` desc 

我在以下一种情况下遇到问题:

来自该用户 ID 的用户 ID (1,2,3,4) 的用户 ID (1,2,3,4,5,6,7) 已完成付款。用户 ID (5,6,7)还没有完成支付。所以用户 id(5,6,7) 的条目不存在于支付表中。

和用户 ids(1,2,3,4,5,6,7) 已经完成交易并且他们的条目出现在交易表中。并且还会生成发票。

从上面的查询中,我只得到了用户 ids(1,2,3,4) 的记录,因为它的条目存在于支付表中。 我还想要记录谁的条目不存在于付款表中。 请问有人可以帮我解决我的问题吗?

【问题讨论】:

    标签: php mysql group-by left-join inner-join


    【解决方案1】:

    如果在与左连接表相关的 where 子句中添加 a 条件,您将获得内连接

     WHERE 
    `u`.`UserType` = 'User' 
    AND `pmt`.`TotalCreditedAmt` - trns.TotalDeductAmt < '0' //this should be place in on clause  
    

    例如:

      ) as trns ON `trns`.`UserId` = `u`.`id`  
           and  `pmt`.`TotalCreditedAmt` - trns.TotalDeductAmt < '0' 
     WHERE  `u`.`UserType` = 'User' 
    

    【讨论】:

      【解决方案2】:

      如果我正确理解您的问题,您需要将此查询用于pmt。这个想法是为付款表中不存在的用户返回0

      单独运行此查询并检查您是否正确获取TotalCreditedAmt。稍后您可以将其插入主查询。

      (
      SELECT 
          sum(case when p.userid is null then 0 else p.CreditedAmount) AS TotalCreditedAmt, 
          u.Id 
      FROM 
          Users u left join Payment p on p.Userid=u.id
      where 
          p.PaymentSucc = "Yes" 
      GROUP BY 
          u.Id
      ) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-04
        • 2014-03-04
        • 1970-01-01
        • 1970-01-01
        • 2018-11-19
        相关资源
        最近更新 更多