运行一个SQL查询,该查询会提取发票清单,包括最近的交易。
要求:
settled
unpaid
且没有最后一笔交易的所有发票)棘手的部分是我们正在处理多对多场景。我发现的所有StackOverflow帖子都是关于一对多场景的。以下SO帖子似乎把我带到正确的方向,但无法安静地弄明白:SQL join: selecting the last records in a one-to-many relationship
我在这里有多对多的原因是因为交易可以是许多发票的一部分。基本上可以将多个发票分配到同一个付款配置文件,因此我们创建一个交易(而不是为每个发票分别设置一个交易)。此外,发票可以包含许多交易,因为交易可以被拒绝。
我知道您可能会想,为什么不拥有一份总体发票,然后将当前的发票变成invoice_lines,或者其他类似的东西,但不幸的是,此时架构无法更改。
以下是我的表格概述:
任何帮助都将非常感谢!
答案 0 :(得分:1)
采用Bill Karwins解决此类问题的方法来查找任何invoice_id的最新交易:
SELECT
it.invoice_id,
t1.*
FROM
invoice_transaction it
INNER JOIN
transaction t1
ON
it.transaction_id = t1.id
LEFT OUTER JOIN
transaction t2
ON
(it.transaction_id = t2.id
AND
(t1.created_at < t2.created_at OR t1.created_at = t2.created_at AND t1.id < t2.id))
WHERE
t2.id IS NULL
将t1作为该invoice_id的最新事务。因此,您只需加入发票表即可获取此发票的详细信息:
SELECT
i.*
it.invoice_id,
t1.*
FROM
invoice_transaction it
-- we can add our join to the invoice table here
INNER JOIN
invoice i
ON
it.invoice_id = i.id
-- and we're done
INNER JOIN
transaction t1
ON
it.transaction_id = t1.id
LEFT OUTER JOIN
transaction t2
ON
(it.transaction_id = t2.id
AND
(t1.created_at < t2.created_at OR t1.created_at = t2.created_at AND t1.id < t2.id))
WHERE
t2.id IS NULL
现在,您可以根据需要过滤具有特定金额的发票或在特定日期到期的发票,方法是将其添加到WHERE
子句中。
这就是我的意思,不应该太难以适应您在StackOverflow上已经找到的解决方案。