Один из способов сделать это - с помощью имитации row_number
DROP TABLE IF EXISTS T,T1;
CREATE TABLE T (ID INT, NAME VARCHAR(10));
CREATE TABLE T1( id varchar(2), product_id int, manufacturer_id varchar(20), manufacturer_product_code varchar(20));
insert into t values(12,'foo');
insert into t1 values
('XX' , 12 , 'ABCD' , 'X1X2'),
('YY' , 12 , 'LMKO' , 'AAAB');
select t.name,t.id,
max(case when rownumber = 1 then manufacturer_product_code else '' end) man1,
max(case when rownumber = 2 then manufacturer_product_code else '' end) man2,
max(case when rownumber = 3 then manufacturer_product_code else '' end) man3,
max(case when rownumber = 4 then manufacturer_product_code else '' end) man4
from t
join
(
select t1.*,
if(t1.product_id <> @p,@rn:=1,@rn:=@rn+1) rownumber,
@p:=t1.product_id p
from t1
cross join (select @rn:=0,@p:=0) r
order by t1.product_id,t1.id
) s
on s.product_id = t.id
group by t.name,t.id;
. В этом запросе в подзапросе выделяется номер строки, а во внешнем запросе используется условное агрегирование, чтобы назначить производителя столбцу.
+------+------+------+------+------+------+
| name | id | man1 | man2 | man3 | man4 |
+------+------+------+------+------+------+
| foo | 12 | X1X2 | AAAB | | |
+------+------+------+------+------+------+
1 row in set (0.00 sec)
Если у вас версия 8 или выше, вы можете использовать оконную функцию row_number вместо симуляции с использованием переменных в подзапросе.