连接两个表而不丢失相关值

2024-03-11

我有两个表代表客户产品及其竞争对手产品的数据库:

tmp_match- from_product_id 和 to_product_id 分别表示客户产品和竞争对手产品之间的匹配。

tmp_price_history- 显示每个日期每种产品的价格。

我正在尝试编写一个查询,它将列出表中的所有日期tmp_price_history。对于每个日期,我想根据表中的产品匹配对查看客户产品价格与竞争对手产品价格tmp_match,无论是否有价格历史记录对于客户产品或竞争对手产品或两者:

如果两个价格在特定日期均可用 - 将它们都列在其列中

如果只有客户产品的记录 - 仅显示客户价格(并将竞争对手列留空)。

如果只有竞争对手产品的记录 - 在其列中显示竞争对手的价格。

预期结果:

date    from_product_id to_product_id   cust_price  comp_price
1       1               11              99          95
2       1               11              98          94
1       1               12                          92
2       1               12                          91
2       2                               108                 

我尝试使用以下查询来实现这一目标:

 select cust_hist.date, from_product_id, to_product_id, cust_hist.price as cust_price,comp_hist.price as comp_price
from tmp_match as matches
       left join tmp_price_history cust_hist
         on cust_hist.product_id = matches.from_product_id
       left join tmp_price_history comp_hist
         on  comp_hist.product_id = matches.to_product_id
;

但它并没有实现我的目标,如此所示sql 片段 http://sqlfiddle.com/#!9/9f3a8f/2.


我认为您正在寻找这个:

select distinct *
from (SELECT date,
             if(group_concat(distinct cust_price), from_product_id, null)as from_product_id,
             if(group_concat(distinct comp_price), to_product_id, null)  as to_product_id,
             group_concat(distinct cust_price)                           as cust_price,
             group_concat(distinct comp_price)                           as comp_price
      FROM (select cust_hist.date,matches.from_product_id,
                   matches.to_product_id,cust_hist.price cust_price,
                   comp_hist.price                       comp_price
            from tmp_match matches
                   inner join tmp_price_history cust_hist on matches.from_product_id = cust_hist.product_id
                   inner join tmp_price_history comp_hist on matches.to_product_id = comp_hist.product_id
            WHERE comp_hist.date = cust_hist.date
            union
            select comp_hist.date,matches.from_product_id,
                   matches.to_product_id,null as cust_price,
                   comp_hist.price               comp_price
            from tmp_price_history comp_hist
                   join tmp_match matches
                     on matches.to_product_id = comp_hist.product_id # and matches.from_product_id is null

            union
            select cust_hist.date,matches.from_product_id,
                   matches.to_product_id,
                   cust_hist.price cust_price,
                   null            comp_price
            from tmp_price_history cust_hist
                   join tmp_match matches
                     on matches.from_product_id = cust_hist.product_id # and matches.to_product_id is null

            order by DATE, from_product_id, to_product_id, cust_price, comp_price) as u
      group by date,from_product_id,to_product_id) g

你关于 sql 片段的想法很棒!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连接两个表而不丢失相关值 的相关文章

随机推荐