2016-04-07 6 views
0

私はMySQLデータベースからデータを取得しようとしています。 テーブルの構造(Tab_1)があります:多列を列に変換する

id key  value 
1 address xyz 
1 post_code 120 
1 country CA 

あなたは、これは実際に注文の詳細情報である見ることができるように。

キー列を実際の列に、値をこの列の値に変換します。 意味:id=1はこの程度の鍵です

id address post_code country 
------------------------------------ 
    1 xyz  120   CA 

MySQLのテーブルは変更できません。私たちが使用しているクローズドシステムの一部(WordPressプラグイン)私はちょうどそれからいくつかのデータを取得するクエリを作成したい。...データ:

Select x.address ,x.post_code, x.country 
from orders 
join (...) as x using (order_id=id) 
where order_id=1 

それは与えるべきである:参加中

address post_code country 
------------------------------------ 
     xyz  120   CA 

をあなたはそれがアドレスであるxのすべてのフィールドを取得すると仮定見ることができるように、post_code、国など ...はどこです私は変換するクエリを置く必要がありますTab_1を読み込み可能な構造に結合します。

どうすればいいですか?

+0

GROUP BY、異なるキーのタイプのケース式を,. – jarlh

+0

グループ化はこの問題を解決しません。値は列に変換されません。 'key'は列になり、' value'はこの列の値になります。私が選択した 'x.address'で言うと、' xyz'を私に与えたい。 – java

答えて

2

は、GROUP BYを行い異なるキータイプについてCASE式を使用:

select id, 
     max(case when key = 'address' then value end) as address, 
     max(case when key = 'post_code' then value end) as post_code, 
     max(case when key = 'country' then value end) as country 
from orders 
group by id 
+0

なぜMaxを使用しますか? – java

+0

null以外の値を選択します。 MINも使用できます。 (私はIDあたり1つのアドレス/ post_code/countryがあると仮定します) – jarlh

+0

はい、1つしかありません...これはなぜ最大値も最小値も必要でないのか理解できない理由です... – java

0

あなたはわずか4選択し使用することができます。

SELECT id, (SELECT value FROM Tab_1 WHERE id = 1 AND `key` = 'address') AS address, 
(SELECT value FROM Tab_1 WHERE id = 1 AND `key` = 'post_code') AS post_code, 
(SELECT value FROM Tab_1 WHERE id = 1 AND `key` = 'country') AS country FROM Tab_1 
GROUP BY id; 
+1

これを実行している場合は、少なくとも相関サブクエリがあります。 (今は常にid = 1の値を返します。) – jarlh

関連する問題