आप जो मांग रहे हैं वह मूल रूप से एक PIVOT
है लेकिन MySQL में पिवट फ़ंक्शन नहीं है, इसलिए आप इसे CASE
. का उपयोग करके दोहरा सकते हैं एक समग्र कार्य के साथ बयान।
यदि आप मूल्यों को जानते हैं, तो आप इसके समान समाधान को हार्ड-कोड कर सकते हैं:
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;
देखें SQL Fiddle with Demo
नतीजा यह है:
| ID | EMAIL | FIRSTNAME | LASTNAME | PHONE |
-----------------------------------------------------------
| 1 | [email protected] | firstname1 | lastname1 | phone1 |
| 2 | email2 | firstname2 | lastname2 | phone2 |
मैं अनुमान लगा रहा हूं कि आपके पास कंपोनेंट_आईडी को एक नाम से जोड़ने के लिए एक टेबल है, ताकि आपकी क्वेरी भी हो सके:
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;
देखें SQL Fiddle with Demo
यदि आपके पास अज्ञात संख्या में मान हैं, तो आप इस क्वेरी को गतिशील रूप से उत्पन्न करने के लिए तैयार कथन का उपयोग कर सकते हैं:
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;
देखें SQL Fiddle with Demo
सभी संस्करण आपको समान परिणाम देंगे।