将深度匹配表变为扁平表的最佳方法

时间:2017-06-06 20:07:13

标签: mysql

我有一个很深的mysql表,有4列

source1 | id1 | source2 | id2
red     |   1 | blue    |   1
red     |   1 | green   |   3
red     |   1 | green   |   6
red     |   2 | blue    |   2
red     |   3 | blue    |   2

我想要的是...... (source)_ids,(source)_ids,(source)_ids,(source)_ids等,每个不同的源具有不同的列。

所以

...变为

red_ids | blue_ids | green_ids
1       |   1      | 3, 6
2,3     |   2      | NULL

我试图用case和group_concat完成这个,但还没有得到我想要的结果。在我尝试通过编写python程序来做到这一点之前,任何人都知道这是否有正常约定?

如果添加新来源,动态会更好。

提前致谢。

1 个答案:

答案 0 :(得分:0)

实际上,这个问题比第一次出现时更棘手。在我看来几乎不可能想到一种在SQL中动态构建它的方法 - 所以我很想转向应用程序层解决方案 - 但有人可能有另一个想法......

     SELECT GROUP_CONCAT(DISTINCT r.id1) red
          , GROUP_CONCAT(DISTINCT b.id2) blue
          , GROUP_CONCAT(DISTINCT g.id2) green
       FROM my_table r 
       LEFT
       JOIN my_table b 
         ON b.id1 = r.id1
        AND b.source2 = 'blue'
       LEFT
       JOIN my_table g 
         ON g.id1 = r.id1
        AND g.source2 = 'green'
      WHERE r.source1 = 'red'
      GROUP
         BY r.source1
          , b.source2
          , g.source2;