Вы не можете создавать столбцы динамически, поэтому вам нужно заранее знать, что вы хотите использовать в качестве столбцов.
Если атрибуты (1,2,3,4) представляют (имя, фамилия, имя, дополнительное имя, дополнительное имя)Вы можете запросить его следующим образом:
select e.id
,v1.value as firstname
,v2.value as lastname
,v3.value as extraname
,v4.value as additionalname
from entity e
left join values v1 on(e.id = v1.entity and v1.attributes = 1)
left join values v2 on(e.id = v2.entity and v2.attributes = 2)
left join values v3 on(e.id = v3.entity and v3.attributes = 3)
left join values v4 on(e.id = v4.entity and v4.attributes = 4)
where e.id = ?
или
select e.id
,max(case when v.attributes = 1 then value) as firstname
,max(case when v.attributes = 2 then value) as lastname
,max(case when v.attributes = 3 then value) as extraname
,max(case when v.attributes = 4 then value) as additionalname
from entity e
left join values v on(e.id = v.entity)
where v.attributes in(1,2,3,4)
and e.id = ?
group by e.id;
Вы также можете использовать GROUP_CONCAT , чтобы вернуть значения в списке через запятую в одном столбце.
select e.id
,group_concat(v.value)
from entity e
left join values v on(e.id = v.entity)
group
by e.id;
О, а values
- зарезервированное слово.Не используйте его в качестве имени таблицы.
О, 2, не используйте эту модель, если вам действительно не нужно.Вы заплатите большую сочную цену с точки зрения производительности и согласованности данных.