このタイプのデータ変換はPIVOTとして知られています。 MySQLは、ピボット機能はありませんが、あなたはCASE
式で集計関数を使用して、それを複製することができます。
select t1.id,
t1.name,
max(case when t2.`key` = 'address' then t2.value end) address,
max(case when t2.`key` = 'city' then t2.value end) city,
max(case when t2.`key` = 'region' then t2.value end) region,
max(case when t2.`key` = 'country' then t2.value end) country,
max(case when t2.`key` = 'postal_code' then t2.value end) postal_code,
max(case when t2.`key` = 'phone' then t2.value end) phone
from table1 t1
left join table2 t2
on t1.id = t2.id
group by t1.id, t1.name
はSQL Fiddle with Demoを参照してください。
また、これはあなたのtable2
に参加し、あなたが各key
のために参加する上でのフィルタが含まれる複数のを使って書くことができます
select t1.id,
t1.name,
t2a.value address,
t2c.value city,
t2r.value region,
t2y.value country,
t2pc.value postal_code,
t2p.value phone
from table1 t1
left join table2 t2a
on t1.id = t2a.id
and t2a.`key` = 'address'
left join table2 t2c
on t1.id = t2c.id
and t2c.`key` = 'city'
left join table2 t2r
on t1.id = t2r.id
and t2c.`key` = 'region'
left join table2 t2y
on t1.id = t2y.id
and t2c.`key` = 'country'
left join table2 t2pc
on t1.id = t2pc.id
and t2pc.`key` = 'postal_code'
left join table2 t2p
on t1.id = t2p.id
and t2p.`key` = 'phone';
はSQL Fiddle with Demoを参照してください。
key
値の数が限られている場合、上記の2つのバージョンは効果的です。
| ID | NAME | ADDRESS | CITY | REGION | COUNTRY | POSTAL_CODE | PHONE |
|----|------|----------|--------|--------|---------|-------------|-----------|
| 1 | Jim | X Street | NY | (null) | (null) | (null) | 123456789 |
| 2 | Bob | (null) | (null) | (null) | (null) | (null) | (null) |
| 3 | John | (null) | (null) | (null) | (null) | (null) | (null) |
:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when t2.`key` = ''',
`key`,
''' then t2.value end) AS `',
`key`, '`'
)
) INTO @sql
from Table2;
SET @sql
= CONCAT('SELECT t1.id, t1.name, ', @sql, '
from table1 t1
left join table2 t2
on t1.id = t2.id
group by t1.id, t1.name;');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
が結果を与えるSQL Fiddle with Demo
すべてのバージョンを参照してください:あなたは値の未知の数を持っている場合は、動的SQLを生成するために準備されたステートメントを使用して見たいと思うでしょう
bluefeetこの動的クエリを実行すると、次のエラーメッセージが表示されます。 "#1243 - 不明なプリペアドステートメントハンドラstmt) " – n0nnus
@ n0nnus残念ながら、私はあなたのデバッグを支援するMySQLの専門家ではありませんが、[リンク1](http://stackoverflow.com/questions/17418809/mysql-1243-error-while-phpmyadmin実行時エラー)、[リンク2](http://stackoverflow.com/questions/14840592/unknown-prepared-statement-handler-0-given-to-mysql -stmt-execute-in-php-code)と[リンク3](http:// stackoverflow。com/questions/16074952/mysql-1243-unknown-prepared-statement-handler-stmt-given-to-execute)を実行します。あなたはおそらくここやGoogleでエラーを解決するための助けを見つけるでしょう。とにかく – Taryn
ありがとう! ;) – n0nnus