共用体を使用せずにMySQLで列に行をトランスポーズ?
質問
私は以下の次のようなテーブルがあります:
id | cat | one_above | top_level |
0 'printers' 'hardware' 'computers'
私は私の行には、このテーブルの列を転置結果セットを返します組合をを、使用しなくてもを、クエリを記述できるようにしたいです。これが何を意味するのか、私は結果になりたいということです。
id | cat |
0 'printers'
0 'hardware'
0 'computers'
は、MySQLで、このことは可能ですか?私は、アプリケーション層に落下し、私はインデックスがIDに基づいてます検索エンジンにこれらを供給していますので、これを実行することはできません。様々な他のDBMSは、PIVOTとUNPIVOTのようなものを持っています。私は私が欠けている何かに任意の洞察力をいただければ幸いです。
マフムード
P.Sます。
これは簡単な作業ではありませんので、私は、最後のオプションとして、データベースの再正規化を考慮しています。
ありがとうございます。
解決
私は本SQL でのアート、ページの外にこれを得ました284から286:
のは、あなたのテーブル名がfoo
あるとしましょう。
まず、pivot
と呼ばれるテーブルを作成します:
CREATE Table pivot (
count int
);
あなたはfoo
で旋回するようにしたい列があるとして多くの行としてそのテーブルに挿入します。あなたが旋回するようにしたいfoo
で3つの列を持っているので、ピボットテーブル内の3行を作成します:
insert into pivot values (1);
insert into pivot values (2);
insert into pivot values (3);
今デカルトは、カウントに基づいて、正しい列を選択しfoo
を使用して、pivot
とCASE
間の結合を行います:
SELECT foo.id, Case pivot.count
When 1 Then cat
When 2 Then one_above
When 3 Then top_level
End Case
FROM foo JOIN pivot;
これが何をしたいあなたを与える必要があります。
他のヒント
私はこのページこれまたはあなたの答えを含んでも含まなくてもよいです。これは、MySQLで難しいけど(それはおそらく恐ろしく実行することになりますが)私が説明する使用して、このように移調うクエリを作成することができますビューの概念的な観点からです。だから私たちはそれを正しい方法を行うための方法を考え出すことができることを確信しています。