このタイプのデータ変換はピボットとして知られていますが、MySQL にはピボット機能がありません。したがって、式を含む集計関数を使用して複製する必要がありCASE
ます。
値の数が事前にわかっている場合は、次のようなクエリをハードコーディングできます。
select t1.id,
t1.name,
max(case when t2.value = 'something' then t2.setting end) as setting1,
max(case when t2.value = 'something2' then t2.setting end) as setting2,
max(case when t2.value = 'something3' then t2.setting end) as setting3
from table1 t1
left join table2 t2
on t1.id = t2.table_1_id
group by t1.id, t1.name;
デモで SQL Fiddle を参照してください
ただし、列に変換する値の数が不明な場合は、準備済みステートメントを使用して動的 sql を生成できます。
クエリは次のようになります。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when t2.value = ''',
value,
''' then t2.setting end) AS `',
value, '`'
)
) INTO @sql
FROM table2;
SET @sql = CONCAT('SELECT t1.id,
t1.name, ', @sql, '
FROM table1 t1
left join table2 t2
on t1.id = t2.table_1_id
group by t1.id, t1.name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
デモで SQL Fiddle を参照してください
両方のバージョンの結果は次のとおりです。
| ID | NAME | SOMETHING | SOMETHING2 | SOMETHING3 |
---------------------------------------------------
| 1 | Mike | setting1 | setting2 | setting3 |