В MySQL 8+ вы можете использовать оконные функции для перечисления значений атрибутов, а затем агрегировать:
select t.*,
max(case when ea.attr_name like 'PP%' then ea.attr_name end),
max(case when ea.attr_name like 'PP%' then ea.attr_value end),
max(case when ea.attr_name like 'PD%' then ea.attr_name end),
max(case when ea.attr_name like 'PD%' then ea.attr_value end)
from T1 t join
(select ea.*,
row_number() over (partition by ea.id, left(ea.attr_name, 2) order by ea.id) as seqnum
from t2 ea
) ea
on ea.id = t.id
group by t.id, ea.seqnum;
РЕДАКТИРОВАТЬ:
Один из подходов к этому в более ранних версиях заключается виспользуйте переменные:
select t.*,
max(case when ea.attr_name like 'PP%' then ea.attr_name end),
max(case when ea.attr_name like 'PP%' then ea.attr_value end),
max(case when ea.attr_name like 'PD%' then ea.attr_name end),
max(case when ea.attr_name like 'PD%' then ea.attr_value end)
from T1 t join
(select ea.*,
(@rn := if(@ida = concat_ws(':', ea.id, left(ea.attr_name, 2)), @rn + 1,
if(@ida := concat_ws(':', ea.id, left(ea.attr_name, 2)), 1, 1)
)
) as seqnum
from (select ea.*
from t2 ea
order by ea.id, left(ea.attr_name, 2)
) ea cross join
(select @ida := '', @rn := 0) params
) ea
on ea.id = t.id
group by t.id, ea.seqnum;