【问题标题】:Join differences between tables in mysql连接mysql中表之间的差异
【发布时间】:2015-10-25 17:14:07
【问题描述】:

我有一张名为cash_billings_bills_articles 的表包含原始发票中的项目,另一张cash_billings_returns_articles 保存新的更改历史发票或退款。

cash_billings_bills_articles 数据:

cash_billings_returns_articles 数据:

我需要进行连接以获得以下结果:

有什么想法吗?谢谢

SQL 小提琴SQL Fiddle Demo

更新:

这是我需要做的一个小图表演示:

【问题讨论】:

  • 您如何将 cashbilling_id 41131 与 cashbillingreturn_id 100 和文章 id 5699 配对(结果集中从上往下的第二行)?第5699条不在退货表中。
  • 第5699条是从cash_billings_bills_articles表中得到的,GROUP BY(cashbilling_id, cashbillingreturn_id)的每一个MIN值都需要和cash_billings_bills_articles比较,如果不存在则添加这条记录获取差异。
  • 我不明白你想要实现什么,所以不知道。你必须用简单的英语描述你想要什么以及你是如何解决这个问题的。
  • 所以你对我想要做的事情有一个更清晰的想法是获取发票之间的净差异,比较发票记录。一切从注册为bill 发票开始,然后如果它被修改,更改将保存为历史返回。我尝试了很多方法,但都没有达到预期的效果,这就是我决定在这里寻求帮助的原因。
  • cashbilling_id 是主要文档编号,cashbillingbill_idcashbillingreturn_id 是参考编号,所以我想获得所有回报以及每个参考的历史变化。考虑到任何账单开始只有一个账单参考并在cash_billings_returns_articles 表中返回多个参考。

标签: mysql sql database join


【解决方案1】:

这是一个查询,它将获得您问题中显示的结果集。但是,业务规则可能无法完全实施,因为仅从输出中很难破译。此外,这可能最好用过程语言完成,因为它需要跨行进行一些计算。

它利用左右外连接和联合从两个表中获取所有行。

select cashbilling_id,
       ifnull(cashbillingreturn_id,min_cashbillingreturn_id) cashbillingreturn_id,
       article_id,
       total,
       diff,
       ifnull(cashbillingreturn_date,min_cashbillingreturn_date) cashbillingreturn_date
from(
      select cashbilling_id,
             ifnull(a_article_id,b_article_id) article_id,
             cashbillingbillarticle_total,
             cashbillingreturnarticle_total,
             ifnull(cashbillingreturnarticle_total,cashbillingbillarticle_total) total,
             ifnull(cashbillingreturnarticle_total,0) - ifnull(cashbillingbillarticle_total,0) diff,
             cashbillingreturn_id,
             cashbillingreturn_date,
             case when @group_id = cashbilling_id then @min_id
                  when @group_id != cashbilling_id then @min_id := cashbillingreturn_id
                  when @group_id := cashbilling_id then @min_id := cashbillingreturn_id
             end min_cashbillingreturn_id,
             case when @date_group_id = cashbilling_id then @min_date
                  when @date_group_id != cashbilling_id then @min_date := cashbillingreturn_date
                  when @date_group_id := cashbilling_id then @min_date := cashbillingreturn_date
             end min_cashbillingreturn_date
      from(
        select a.cashbilling_id,
               a.article_id a_article_id,
               b.article_id b_article_id,
               b.cashbillingreturnarticle_total,
               a.cashbillingbillarticle_total,
               b.cashbillingreturn_id,
               b.cashbillingreturn_date
        from cash_billings_bills_articles a
        left join cash_billings_returns_articles b on (a.cashbilling_id = b.cashbilling_id and a.article_id = b.article_id)
        union
        select b.cashbilling_id, a.article_id a_article_id, b.article_id b_article_id, b.cashbillingreturnarticle_total, a.cashbillingbillarticle_total, b.cashbillingreturn_id, b.cashbillingreturn_date
        from   cash_billings_bills_articles a
        right join cash_billings_returns_articles b on (a.cashbilling_id = b.cashbilling_id and a.article_id = b.article_id)
      ) q join (select @min_id := null as m, @min_date := null as d, @group_id := null as g, @date_group_id := null as dg) v
      order by cashbilling_id, -cashbillingreturn_id desc
    ) q
    where min_cashbillingreturn_id is not null
    order by cashbilling_id, cashbillingreturn_id, abs(diff)
    ;

【讨论】:

  • 感谢您为解决我的问题所做的努力。
猜你喜欢
  • 1970-01-01
  • 2021-10-14
  • 2014-03-11
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多