查找多对多的最新联合记录

时间:2014-06-17 22:29:22

标签: mysql sql database relational-database

运行一个SQL查询,该查询会提取发票清单,包括最近的交易。

要求:

  • 使用1个查询获取此信息(可能需要内部查询)
  • 包括尚未进行交易的发票
  • 能够按发票或交易中的字段进行过滤。示例场景如下:
    • 示例1:所有发票的最后交易状态为settled
    • 的发票
    • 示例2:状态为unpaid且没有最后一笔交易的所有发票)

棘手的部分是我们正在处理多对多场景。我发现的所有StackOverflow帖子都是关于一对多场景的。以下SO帖子似乎把我带到正确的方向,但无法安静地弄明白:SQL join: selecting the last records in a one-to-many relationship

我在这里有多对多的原因是因为交易可以是许多发票的一部分。基本上可以将多个发票分配到同一个付款配置文件,因此我们创建一个交易(而不是为每个发票分别设置一个交易)。此外,发票可以包含许多交易,因为交易可以被拒绝。

我知道您可能会想,为什么不拥有一份总体发票,然后将当前的发票变成invoice_lines,或者其他类似的东西,但不幸的是,此时架构无法更改。

以下是我的表格概述:

Diagram

任何帮助都将非常感谢!

1 个答案:

答案 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上已经找到的解决方案。