2014-05-08 45 views
1

我有兩個表格,分別是X和表格Y.X有order_id,offer_id。一個order_id可以有多個offer_id。現在我想要插入數據到Y(id,offer_id),以這種方式爲每個不同的offer_id組合我想要一個id。例如。通過order_id分組並將id分配給mysql中的offer_id

表X:

order_id offer_id 
2581681  24 
2581681  23 
2581936  23 
2581936  24 
2582001  23 
2582001  24 
2595298  24 
2595298  14 
2596247  24 
2596247  14 
2596268  14 
2596268  24 
1911365  1 
1922052  1 
1922803  1 
1923501  1 
1924074  1 
1924963  1 

數據表Y應該是這樣的:

id  offer_id 
1   23 
1   24 
2   14 
2   24 
3   1 

回答

2

如果你想要的任何數量的優惠,那麼問題就比較硬。這與您想要的接近:

select (@rn := @rn + 1) id, offers 
from (select group_concat(distinct x.offer_id order by x.offer_id) as offers 
     from tableX x 
     group by x.order_id 
    ) xx cross join 
    (select @rn := 0) var 
group by offers; 

這會將報價放在逗號分隔列表的單行中。如果你真的需要它們放在單獨的行,然後,我會建立在此:

select id, substring_index(substring_index(offers, ',', n.n), ',', -1) as offer 
from (select (@rn := @rn + 1) id, offers 
     from (select group_concat(distinct x.offer_id order by x.offer_id) as offers, 
        count(distinct x.offer_id) as numoffers 
      from tableX x 
      group by x.order_id 
      ) xx cross join 
      (select @rn := 0) var 
     group by offers 
    ) o join 
    (select 1 as n union all select 2 as n union all select 3 as n union all select 4 as n 
    ) n 
    on n.n <= numoffers; 

當然,n子查詢需要有至少提供了一個訂單的最大數量。

+0

+1:另一個案例表明我需要克服對group_concat的偏見,因爲它真的可以放在* good * use中。我不知道在沒有'group_concat'的RDBMS中是否有'好'的方法來做到這一點? *(可能使用一些校驗和類型的操作?小心避免碰撞)* – MatBailie

+0

太棒了!感謝@Gordon的幫助! :) – thebignoob