Для поворота только двух столбцов удобно использовать join
s:
select u.*, uac.objvalue as city, uap.objvalue as phone
from users u left join
userattributes uac
on uac.userid = u.userid and
uac.objname = 'city' left join
userattributes uap
on uap.userid = u.userid and
uap.objname = 'phone';
Если вам нужны только строки с совпадениями, добавьте:
where uac.objvalue is not null or uap.objvalue is not null
Если у вас есть больше столбцов тогда join
и group by
, вероятно, лучший подход:
select u.*, au.*
from users u join
(select ua.userid,
max(case when objname = 'city' then objvalue end) as city,
max(case when objname = 'phone' then objvalue end) as phone
from userattributes ua
group by ua.userid
) ua
on u.userid = ua.userid;