Это для завершения @Damian хорошего ответа. Я уже предлагал подход JSON в других ответах до удобной функции json_object_agg
9.6. Это просто требует больше работы с предыдущим набором инструментов.
Два из приведенных возможных недостатков на самом деле нет. При необходимости случайный порядок ключей трижды корректируется. Отсутствующие ключи, если необходимо, занимают почти тривиальное количество кода, подлежащего устранению:
select
row_name as bar,
json_object_agg(attrib, val order by attrib) as data
from
tbl
right join
(
(select distinct row_name from tbl) a
cross join
(select distinct attrib from tbl) b
) c using (row_name, attrib)
group by row_name
order by row_name
;
bar | data
-----+----------------------------------------------
a | { "val1" : 10, "val2" : 20, "val3" : null }
b | { "val1" : 3, "val2" : 4, "val3" : null }
c | { "val1" : 5, "val2" : null, "val3" : null }
d | { "val1" : 6, "val2" : 7, "val3" : 8 }
Для конечного пользователя запроса, который понимает JSON, нет недостатков. Единственное, что он не может быть использован в качестве источника таблицы.
проблема в том, что вы сбрасываете массив во второй раз при входе в цикл
by =
,
, чтобы решить эту проблему, вам нужно добавить немного, если
if(!isset($data[$row->headline_id])) {
$data[$row->headline_id]= array(
'headline_name' => $row->headline_name ,
'score' => $row->score,
);
}
другая проблема: я рекомендую не хранить эти поля в этой таблице не нормализовано,
headline_name
score