mysql - 使用与分组数据行的联接

标签 mysql database join left-join

我有两个表,invoicesdeposits

它们看起来有点像这样:

发票

id    |    paymentType     |     grossTotal   |    dateTime
1     |         Cash       |        1000      |   UNIX TIME    
2     |         Card       |        1350      |   UNIX TIME   
3     |         Card       |        1250      |   UNIX TIME   
4     |         Card       |        750       |   UNIX TIME 

存款

id    |    paymentType     |       invNo      |    dateTime    |     amount
1     |         Cash       |         1        |    UNIX TIME   |       150
2     |         Card       |         2        |    UNIX TIME   |       350

存款总是过去的日期,发票日期将是,例如 今天,所以我想确定今天在发票上支付的余额,即 invoices.grossTotal - deposits.amount,并按支付类型列出。

因此,在上面的表格示例中,发票 1 支付了 850 英镑,发票 2 支付了 1000 英镑,这很容易实现,每行一到两行,但是当对付款类型和存款发票进行分组时我卡住了……

SELECT 
   invoices.id, 
   sum(grossTotal)-IFNULL(depositsCheck.previouslyPaid,0) as todayTotal, 
   depositsCheck.previouslyPaid, sum(grossTotal) as grossTotal  
FROM `invoices`    
    LEFT JOIN (SELECT SUM(amount) as previouslyPaid, invNo 
    FROM deposits 
    GROUP BY invNo) depositsCheck ON depositsCheck.invNo=invoices.id 
GROUP BY  invoices.paymentType ORDER BY id DESC

上面的 SQL 查询适用于使用现金支付的项目,但不适用于卡支付,因为分组 invoices.paymentType 意味着 idinvoices 表中的数据不再正确,因此如果此行具有与存款无关的 id,则 JOIN 将失败。

我如何运行上述查询,但确保我可以加入发票的任何实例上的存款表,按与分组匹配的付款类型分组列 ID 记录?

我正在使用 mySql,所以请发布 MySql 可以执行的连接! :D

最佳答案

问题是,当您使用GROUP BY 时,您只能SELECT 聚合和您分组的列。

invoices.id 是您尝试选择但未分组的列。我想您可能想将此列添加到 GROUP BY 子句中。

SELECT 
   invoices.id, 
   sum(grossTotal)-IFNULL(depositsCheck.previouslyPaid,0) as todayTotal, 
   depositsCheck.previouslyPaid, sum(grossTotal) as grossTotal  
FROM `invoices`    
    LEFT JOIN (SELECT SUM(amount) as previouslyPaid, invNo 
    FROM deposits 
    GROUP BY invNo) depositsCheck ON depositsCheck.invNo=invoices.id 
GROUP BY  invoices.paymentType, invoices.id ORDER BY id DESC

对于您给出的示例表,它可能会给出:

id    |    paymentType     |     grossTotal   |    dateTime   |   previouslyPaid
1     |         Cash       |        1000      |   UNIX TIME   |       150
2     |         Card       |        1350      |   UNIX TIME   |       350
3     |         Card       |        1250      |   UNIX TIME   |         0
4     |         Card       |        750       |   UNIX TIME   |         0

但一般来说,您会遇到类似这样的情况:

id    |    paymentType     |     grossTotal   |    dateTime   |   previouslyPaid
1     |         Cash       |        1000      |   UNIX TIME   |       150
1     |         Card       |        1000      |   UNIX TIME   |       300
2     |         Cash       |        1350      |   UNIX TIME   |       350
2     |         Card       |        1350      |   UNIX TIME   |       350

如上所示,对于发票 1,150 是现金支付的,300 是刷卡支付的。

关于mysql - 使用与分组数据行的联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12316472/

相关文章:

mysql - SQL - 为什么我的查询不起作用?

java - 什么时候使用 Statement 而不是 Prepared Statement?

sql - 如何返回具有聚合列的连接表的第一个值

mysql - 将多个查询组合成一个查询

mysql - 设计器表关系与连接

php - 如何在 laravel 中从联合 mysql 查询传递变量

mysql - Laravel:whereNotIn 没有按预期工作

php - 登录时如何处理不同类型的用户?

Mysql 有条件或无条件连接表

database - 是否有可能获得在 postgres 中进行的查询的历史记录