代码之家  ›  专栏  ›  技术社区  ›  Merijndk

将csv导入mysql,其中多个列需要是多行[duplicate]

  •  1
  • Merijndk  · 技术社区  · 6 年前

    我现在可能看不太清楚,但我在MySQL中有一个表,如下所示:

    ID | a  | b  | c 
    1  | a1 | b1 | c1
    2  | a2 | b2 | c2
    

    ID ,但我想如果有人能帮我解决这一部分,我可以自己做剩下的),我需要这些行变成这样:

    1 | a1 | a
    1 | b1 | b
    1 | c1 | c
    2 | a2 | a
    2 | b2 | b
    2 | c2 | c
    

    因此,基本上,我需要查看以下行: , columntitle , value

    0 回复  |  直到 4 年前
        1
  •  24
  •   Taryn Frank Pearson    12 年前

    不平动 UNION ALL 查询以将列转换为行:

    select id, 'a' col, a value
    from yourtable
    union all
    select id, 'b' col, b value
    from yourtable
    union all
    select id, 'c' col, c value
    from yourtable
    

    看到了吗 SQL Fiddle with Demo

    CROSS JOIN :

    select t.id,
      c.col,
      case c.col
        when 'a' then a
        when 'b' then b
        when 'c' then c
      end as data
    from yourtable t
    cross join
    (
      select 'a' as col
      union all select 'b'
      union all select 'c'
    ) c
    

    SQL Fiddle with Demo

        2
  •  2
  •   Iswanto San Ajay2707    12 年前

    UNION ALL .

    SELECT ID, a, 'a' 
    FROM tbl
    WHERE ID = 1
    UNION
    SELECT ID, b, 'b' 
    FROM tbl
    WHERE ID = 2
    
        3
  •  0
  •   GMB    4 年前

    这花了很长时间,但是MySQL8.0.14最终增加了对横向连接的支持——官方术语是 lateral derived tables .

    这是一个非常强大的特性,在多种情况下都很方便,包括将表列取消激励到行。

    select t.id, x.*
    from mytable t
    cross join lateral (
        select a, 'a' 
        union all select b, 'b'
        union all select c, 'c'
    ) as x(col1, col2)
    

    这可能看起来与典型的插管解决方案没有太大区别-毕竟,我们仍在使用 union all 在横向衍生表格中。。。但别搞错了:这个问题 ,与另一种方法不同,后者需要对每个列进行一次扫描以取消激活。因此,这是更有效的-并且随着表的增大和/或需要取消对更多列的激活,性能的提高会显著增加。

    底线:如果您运行的是MySQL 8.0.14或更高版本,只需使用此技术。从这个版本开始,这是在MYSQL中取消pivot的规范方法。

    Demo on DB Fiddle

    样本数据:

    ID | a  | b  | c 
    -: | :- | :- | :-
     1 | a1 | b1 | c1
     2 | a2 | b2 | c2
    

    查询结果:

    id | col1 | col2
    -: | :--- | :---
     1 | a1   | a   
     1 | b1   | b   
     1 | c1   | c   
     2 | a2   | a   
     2 | b2   | b   
     2 | c2   | c   
    

    旁注

    MySQL8.0.19增加了对 the VALUES statement 全部联合

    幸运的是,从版本8.0.21开始,这个 不起作用

    select t.id, x.*
    from mytable t
    cross join lateral (values 
        row(a, 'a'), 
        row(b, 'b'),
        row(c, 'c')
    ) as x(col1, col2);