mysql中表之间的连接差异

mysql中表之间的连接差异,mysql,sql,database,join,Mysql,Sql,Database,Join,我有一个名为cash\u billings\u bills\u articles的表,其中包含原始发票中的项目,另一个表cash\u billings\u returns\u articles保存新的更改历史发票或退款 cash\u billings\u bills\u article数据: cash\u billings\u returns\u articles数据: 我需要执行联接以获得以下结果: 有什么想法吗?谢谢 SQL小提琴: 更新: 这是我需要做的一点图表演示: 这是一个查询,

我有一个名为
cash\u billings\u bills\u articles
的表,其中包含原始发票中的项目,另一个表
cash\u billings\u returns\u articles
保存新的更改历史发票或退款

cash\u billings\u bills\u article
数据:

cash\u billings\u returns\u articles
数据:

我需要执行联接以获得以下结果:

有什么想法吗?谢谢

SQL小提琴

更新:

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

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

它利用左、右外部联接和并集从两个表中获取所有行

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)
    ;

您是如何将cashbilling_id 41131与cashbillingreturn_id 100和article id 5699(结果集中从顶部开始的第二行)配对的?第5699条不在返回表中。第5699条从
现金账单账单物品
表中获取,每个
最小值
分组依据的值(现金账单id,现金账单返回id)
需要与
现金账单账单物品进行比较
如果不存在,则添加此记录以获取差异。我不明白您想要实现什么,因此不知道。你必须用通俗易懂的英语描述你想要什么,以及你是如何解决问题的。因此,你对我试图做的事情有了更清晰的认识,那就是通过比较发票记录,得到发票之间的净差异。所有操作都以注册为
账单
发票开始,如果修改了发票,则更改将保存为历史记录。我尝试了很多方法,但没有达到预期的效果,这就是我决定在这里寻求帮助的原因。
cashbillingbill\u id
是主要的单据编号,
cashbillingbill\u id
cashbillingreturn\u id
是参考编号,因此我想获得每个参考编号的所有退货及其历史变化。考虑到任何票据开始只有一个票据参考,并在
cash\u billings\u returns\u articles
表中返回多个参考。我感谢您为解决我的问题所做的努力。