2011-01-11 21 views
0

これにはちょっとだけ指示が必要です。私は、次の表を持っている:私が欲しいものMySQL動的にマージする/選択する行を選択

Table: entity 
- ID (INT) 

Table: attributes 
- ID (INT) 
- name (VARCHAR) 
- internalname (VARCHAR) 

Table: values 
- ID (INT) 
- entity (ID) 
- attributes (INT) 
- value (Text) 

は、次のようなものを返します選択なステートメントを作ることです。

- ID = entity.ID 
- {attributes.internalname ID 1} = values.{attribe internalname 1}.value 
- {attributes.internalname ID 2} = values.{attribe internalname 2}.value 
- {attributes.internalname ID 3} = values.{attribe internalname 3}.value 
- {attributes.internalname ID n} = values.{attribe internalname n}.value 
- etc... 

それは組み合わせのように次のようになります。

SELECT entity.id FROM entity; 

および

SELECT (SELECT values.value FROM values WHERE values.entity = entity.ID AND values.attributes = attributes.ID) FROM attributes; 

説明は難しいことですが、私にさらに説明が必要な場合は、教えてください。

属性のすべての値を列に変換し、すべての値をセレクタとしてIDを持つ対応する属性の値に変換することが効果的です。

私はクエリにID(要素ID)を与え、1つの結果行ですべてのデータを返します。

ありがとうございました!

+0

値のテーブルに既に格納されている1つの列のみのテーブルエンティティが存在する理由がわかりません – cfEngineers

+0

インデックスと同じように、いくつかの列が表示されることがあります。これはMagento Commerceがデータを格納する方法と実際に非常によく似ていますが、問題は数百のクエリを使用して同じ結果を得ることです。 – Nitroware

答えて

2

かもしれません。

あなたはこのようにそれを照会できる属性(1,2,3,4)は(FIRSTNAME、姓、extraname、additionalname)を表す場合:また

select e.id 
     ,v1.value as firstname 
     ,v2.value as lastname 
     ,v3.value as extraname 
     ,v4.value as additionalname 
    from entity e 
    left join values v1 on(e.id = v1.entity and v1.attributes = 1) 
    left join values v2 on(e.id = v2.entity and v2.attributes = 2) 
    left join values v3 on(e.id = v3.entity and v3.attributes = 3) 
    left join values v4 on(e.id = v4.entity and v4.attributes = 4) 
where e.id = ? 

または

select e.id 
     ,max(case when v.attributes = 1 then value) as firstname 
     ,max(case when v.attributes = 2 then value) as lastname 
     ,max(case when v.attributes = 3 then value) as extraname 
     ,max(case when v.attributes = 4 then value) as additionalname 
    from entity e 
    left join values v on(e.id = v.entity) 
where v.attributes in(1,2,3,4) 
    and e.id = ? 
group by e.id; 

することができますGROUP_CONCATを使用して、値をカンマ区切りのリストで1つの列に戻します。

select e.id 
     ,group_concat(v.value) 
    from entity e 
    left join values v on(e.id = v.entity) 
group 
    by e.id; 

ああ、valuesは予約語です。それをテーブル名として使用しないでください。

ああ2、あなたが実際にする必要がない限り、このモデルを使用しないでください。あなたは、パフォーマンスとデータの一貫性の面で大きなジューシーな価格を支払うでしょう。

+0

あなたはロック!ありがとう!データストレージのためにどのようなモデルをアドバイスしますか?これは私がシステムのさまざまな要素に使うことを計画していた単なる汎用モデルです... – Nitroware

0

私は選択を厭わない*ので、あなたの列に置き換えてください。あなたが列として望むものを事前に知っておく必要があるので、値は、あなたが動的に列を作成することはできません予約キーワード

select * 
    from values v 

    left join attributes a 
    on a.id = v.attributes 

    left join entity e 
    on e.id = v.entity 

    where 1=1 

    /* put your where clause here */ 
+0

これは私が気に入っているものに非常に近いですが、すべてのデータを1つの行に戻したいと思います。元の投稿を更新しました。 ありがとう! – Nitroware

関連する問題