Apa yang Anda minta pada dasarnya adalah PIVOT
tetapi MySQL tidak memiliki fungsi pivot sehingga Anda dapat mereplikasi ini menggunakan CASE
pernyataan dengan fungsi agregat.
Jika Anda mengetahui nilainya, maka Anda dapat membuat hard-code solusi yang mirip dengan ini:
select id,
max(case when component_id = 1 then data end) Email,
max(case when component_id = 2 then data end) Firstname,
max(case when component_id = 3 then data end) Lastname,
max(case when component_id = 4 then data end) Phone
from yourtable
group by id;
Lihat SQL Fiddle dengan Demo
Hasilnya adalah:
| ID | EMAIL | FIRSTNAME | LASTNAME | PHONE |
-----------------------------------------------------------
| 1 | [email protected] | firstname1 | lastname1 | phone1 |
| 2 | email2 | firstname2 | lastname2 | phone2 |
Saya menduga Anda memiliki tabel untuk mengaitkan component_id dengan nama sehingga kueri Anda juga dapat berupa:
select t1.id,
max(case when t2.name = 'email' then data end) Email,
max(case when t2.name= 'FirstName' then data end) Firstname,
max(case when t2.name= 'LastName' then data end) Lastname,
max(case when t2.name= 'phone' then data end) Phone
from yourtable t1
inner join component t2
on t1.component_id = t2.id
group by t1.id;
Lihat SQL Fiddle dengan Demo
Jika Anda memiliki jumlah nilai yang tidak diketahui, Anda dapat menggunakan pernyataan yang disiapkan untuk menghasilkan kueri ini secara dinamis:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when name = ''',
name,
''' then data end) AS ',
name
)
) INTO @sql
FROM component;
SET @sql = CONCAT('SELECT t1.id, ', @sql, '
from yourtable t1
inner join component t2
on t1.component_id = t2.id
group by t1.id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Lihat SQL Fiddle dengan Demo
Semua versi akan memberi Anda hasil yang sama.