MySQL增量列

时间:2016-09-04 19:23:41

标签: mysql

我有一张如下表:

ID|Prototype_A|Prototype_B|Prototype_C|Prototype_D|
---------------------------------------------------
1 |Fast381A   |Blue4812   | Green7181 | White4812 |
---------------------------------------------------
2 |Slow841C   |Orange8312 | null      | null      |
---------------------------------------------------
3 |Plane281K  | null      | null      | null      |
---------------------------------------------------

我需要查询返回该ID的所有非null原型。 例如:

  • 1:Fast381A,Blue4812,Green7181,White4812
  • 2:Slow841C,Orange8312
  • 3:Plane281K
  • 有没有办法让通配符选择所有列,例如select(Prototype_*),还是应该以不同的格式设置我的表?

    例如,我被教导过这种结构是不好的做法:

    ID|Prototypes|
    ---------------------------------------------------
    1 |Fast381A,Blue4812,Green7181,White4812 
    ---------------------------------------------------
    2 |Slow841C,Orange8312
    ---------------------------------------------------
    3 |Plane281K
    ---------------------------------------------------
    

    3 个答案:

    答案 0 :(得分:2)

    SQL查询返回一组固定的列。如果要将非NULL值组合到一个列中,我建议concat_ws()

    select id,
           concat_ws(',', Prototype_A, Prototype_B, Prototype_C, Prototype_D)
    from t;
    

    忽略NULL值。查询返回两列,一列是原型列表。

    而且,你的问题的答案是"是"。您应该考虑更改数据结构。有多个列存储相同的东西,只有一个索引标识它们通常意味着你想要一个单独的表,每个id和每个原型有一行。

    编辑:

    你想要一个这样的表:

    create table ModelPrototypes (
        ModelProtypeId int primary key auto_increment,
        ModelId int not null,
        ProtoTypeChar char(1),
        Prototype varchar(255)
    );
    

    然后你会用以下值填充它:

    1   A    Fast381A
    1   B    Blue4812
    1   C    Green7181
    1   D    White4812 
    

    我不确定是否真的需要PrototypeChar,但信息在您的表格中。

    答案 1 :(得分:0)

    没有通配符选择列的方法。

    你能做什么:

    将您的表设置为

    ID, Prototype_type, Prototype_name
    

    然后使用GROUP_CONCAT

    SELECT id, GROUP_CONCAT(Prototype_name SEPARATOR ',')
    FROM table GROUP BY Prototype_name 
    

    答案 2 :(得分:0)

    "Should I setup my table in a different format?"

    是。您的表格可能如下所示:

    ID Prototype_Code Prototype 
    ------------------------------
     1 A              Fast381A  
     1 B              Blue4812  
     1 C              Green7181 
     1 D              White4812 
     2 A              Slow841C  
     2 B              Orange8312
     3 A              Plane281K