Това, което искате, е основно PIVOT
но MySQL няма централна функция, така че можете да репликирате това с помощта на CASE
изявление с агрегатна функция.
Ако знаете стойностите, тогава можете да кодирате решението подобно на това:
изберете идентификатор, макс(случай, когато компонент_id =1, след това край на данните) Имейл, макс(случай, когато component_id =2, след това край на данните) Първо име, макс случай, когато идентификатор_компонент =4, след това данните край) Телефон от вашата таблицагрупа по идентификатор;
Вижте SQL Fiddle с демонстрация
Резултатът е:
<предварителен код>| ID | ИМЕЙЛ | ПЪРВО ИМЕ | ФАМИЛИЯ | ТЕЛЕФОН |------------------------------------------------ -----------| 1 | [email protected] | име1 | фамилия1 | телефон1 || 2 | имейл2 | име2 | фамилия2 | телефон 2 |Предполагам, че имате таблица за свързване на component_id с име, така че вашата заявка също може да бъде:
изберете t1.id, max(случай, когато t2.name ='email' след това край на данните) Email, max(случай, когато t2.name='FirstName', след това край на данните) Първо име, max(случай, когато t2 .name='LastName' след това край на данните) Фамилно име, максимум (случай, когато t2.name='телефон', след това край на данните) Телефон от вашата таблица t1inner join компонент t2 на t1.component_id =t2.id група от t1.id;
Вижте SQL Fiddle с демонстрация
Ако имате неизвестен брой стойности, тогава можете да използвате подготвен израз, за да генерирате тази заявка динамично:
SET @sql =NULL;SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(случай, когато име =''', име, ''' след това край на данните) AS ', име ) ) INTO @sqlFROM компонент;SET @sql =CONCAT('ИЗБЕРЕТЕ t1.id, ', @sql, ' от вашата таблица t1 вътрешен компонент за присъединяване t2 на t1.component_id =t2.id група от t1.id');ПРИГОТВЕТЕ stmt ОТ @sql;ИЗПЪЛНЕТЕ stmt;ОТМЕНИ ПОДГОТВЕТЕ stmt;
Вижте SQL Fiddle с демонстрация
Всички версии ще ви дадат един и същ резултат.