use billing;

alter table contracts add column product_id int(11) unsigned default null;

update 
  contracts c
join (
  select
    bm1.contract_id,
    max(bm1.id) as id
  from
       billing.billing_mappings bm1 
  join (
    select
      bm2.contract_id,
      max(bm2.start_date) as start_date
    from
      billing.billing_mappings bm2 
    where (
      bm2.end_date >= now() or bm2.end_date is null) 
      and (bm2.start_date <= now() or bm2.start_date is null
    ) group by bm2.contract_id
  ) as mx on bm1.contract_id = mx.contract_id and bm1.start_date <=> mx.start_date 
  group by bm1.contract_id
) as bm_actual on bm_actual.contract_id = c.id
join
  billing.billing_mappings bm on bm.id = bm_actual.id
set c.product_id = bm.product_id;

alter table contracts modify column product_id int(11) unsigned not null, add constraint c_productid_ref foreign key (product_id) references products (id) on update cascade;

