Những gì bạn đang yêu cầu về cơ bản là một PIVOT
nhưng MySQL không có hàm pivot nên bạn có thể sao chép nó bằng cách sử dụng CASE
câu lệnh với một hàm tổng hợp.
Nếu bạn biết các giá trị, thì bạn có thể mã hóa giải pháp tương tự như sau:
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;
Kết quả là:
| ID | EMAIL | FIRSTNAME | LASTNAME | PHONE |
-----------------------------------------------------------
| 1 | [email protected] | firstname1 | lastname1 | phone1 |
| 2 | email2 | firstname2 | lastname2 | phone2 |
Tôi đoán rằng bạn có một bảng để liên kết component_id với một tên nên truy vấn của bạn cũng có thể là:
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;
Nếu bạn có một số lượng giá trị không xác định, thì bạn có thể sử dụng một câu lệnh đã chuẩn bị để tạo động truy vấn này:
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;
Tất cả các phiên bản sẽ cho bạn cùng một kết quả.