2016-09-04 5 views
0

私は以下のようなテーブルを持っている: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のために、すべての非ヌルのプロトタイプを返すために、私のクエリを必要としています。例えばそう :

  • 1:Fast381A、Blue4812、Green7181、White4812
  • 2:Slow841C、Orange8312
  • 3:Plane281K
  • select(Prototype_*)または私がすべきのようにすべての列を選択するワイルドカードする方法はあります私のテーブルを別のフォーマットでセットアップしますか?私はこのタイプの構造を教えてきた例えば

    は悪い習慣です:

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

    ルック(私はありませんが、多分あなたはしたいと思います)。または[ジャンクションテーブル](http://stackoverflow.com/a/32620163)または関連テーブル – Drew

    +0

    でデータを正規化してください。あなたの一番の質問は、ストアドプロシージャのようなものが必要です。それはスキーマ構造を理解し、動的SQLをPREPAREに構成して実行します。そして、オーバーヘッドのために遅くなるでしょう。 – Drew

    +0

    プロトタイプeについてはどうですか? – Strawberry

    答えて

    2

    SQLクエリは列の固定セットを返します。あなたは、単一の列に非NULL値を組み合わせたい場合は、私がconcat_ws()をお勧めします:

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

    これはNULL値を無視します。クエリは2つの列を返し、1つはプロトタイプのリストです。

    あなたの質問に対する答えは「はい」です。データ構造の変更を検討する必要があります。複数の列に同じものが格納されている場合は、それらを識別するインデックスだけで、通常はIDごとに1つのプロトタイプごとに別のテーブルが必要です。

    EDIT:

    あなたはこのようなテーブルをしたい:

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

    私はPrototypeCharが本当に必要とされているかはわからない:

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

    次に、あなたのような値を移入しますしかし、情報はあなたのテーブルにあります。

    +0

    私は別のテーブルの例を教えてください。なぜなら、私は、ますます多くの列を持つテーブルを想定しているからです。 – Edward

    0

    選択列をワイルドカードする方法はありません。あなたは何ができるか

    セットアップあなたのテーブル

    ID, Prototype_type, Prototype_name 
    

    として次にGROUP_CONCAT使用:はい

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

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

    を。次のようにあなたのテーブルに見えるかもしれません:[EAV](http://stackoverflow.com/questions/tagged/entity-attribute-value)に

    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