【问题标题】:Find most recent joined record in a many to many在多对多中查找最近加入的记录
【发布时间】:2014-06-17 22:29:22
【问题描述】:

运行 SQL 查询,该查询会调出包括最近交易在内的发票列表。

要求:

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

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

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

我知道您可能会想,为什么不创建一个总体发票,然后将当前发票设置为 invoice_lines 或类似的内容,但不幸的是,此时无法更改架构。

这是我的表格的大纲:

任何帮助将不胜感激!

【问题讨论】:

  • 你在哪里卡住了?找到任何给定 invoice_id 的最新交易应该不会太难。那么您只需在此列中加入您的发票表即可。
  • @VMai,我希望通过一个查询来执行此操作,这样我就可以使用过滤器运行发票报告(如果有意义的话)。
  • @VMAI 更具体一些,比如“SELECT * WHERE invoice.amount > 50”或类似的东西。

标签: mysql sql database relational-database


【解决方案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 上已经找到的解决方案应该不会太难。

【讨论】:

  • 感谢@VMai!这是一个好的开始,但我不确定当发票还没有交易时这将如何工作。想法?
  • @Roeland 从表 invoice 开始,对我从 Bill Karwins 示例重写的第一个查询进行左连接。因为WHERE 子句只对IS NULL 进行检查,所以无需将其重写为左连接的ON 子句。没有交易的发票不能有最近的交易,因为根本没有交易。
  • 那么你的意思是,如果发票没有交易,就不会显示发票?我希望能够在有或没有最后一笔交易的情况下提取所有发票。
  • 用左连接它会显示交易,当然。
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多