Добрый вечер.
Есть четре таблицы:
1) Группы параметров
2) Параметры (привязаны к группам).
uuid, name, group_id
3) Значения параметров (привязаны к параметрам).
uuid, value, param_id
4) Сводная таблица, где парамерты, их значения привязаны к товару.
uuid, trade, param_id, value_id, group_id(нужен ли id группы в данном случае?)
Необходимо через червёртую таблицу получить параметры со значениями и сгруппировать их по группам.
Пока получился такой запрос (очередной вариатн), но он не даёт нужного результата.
$sql = '
SELECT pa.param,
concat(\'[\', string_agg(pv_value, \',\'), \']\') as pv_value,
concat(\'[\', string_agg(p_name, \',\'), \']\') as p_name,
concat(\'[\', string_agg(g_name, \',\'), \']\') as g_name
FROM amqp_trade_parameters_assignments AS pa
INNER JOIN (
SELECT pv.uuid, parameter, value,
concat(\'{"pv.uuid":"***", "pv_value":"\', value ,\'"}\') as pv_value
FROM amqp_trade_parameters_values AS pv
GROUP BY pv.uuid, pv.parameter
) AS pv
ON pv.uuid::varchar = pa.value::varchar
INNER JOIN (
SELECT p.uuid, p.name, p.group_id, concat(\'{"p_uuid":"***", "p_name":"\', p.name, \'"}\') as p_name
FROM amqp_trade_parameters AS p
GROUP BY p.uuid, p.group_id
) AS p
ON p.uuid = pa.param
INNER JOIN (
SELECT g.uuid, g.name, concat(\'{"g_uuid":"***", "g_name":"\', g.name ,\'"}\') as g_name
FROM amqp_param_groups as g
) AS g
ON g.uuid = p.group_id
WHERE trade = :trade
GROUP BY pa.param
';
$rows = $this->em->getConnection()
->prepare($sql)
->executeQuery(['trade' => $trade]);
$result = $rows->fetchAllAssociative();
В результате получаю следующий ответ:
Array
(
[0] => Array
(
[param] => 35d8e1a8-531d-4275-84c3-4b781d1b1f13
[group_id] => 29fe06d2-db8c-4db5-95a7-36adfe8a71fc
[pv_value] => [{"pv.uuid":"***", "pv_value":"10"}]
[p_name] => [{"p_uuid":"***", "p_name":"Высота"}]
[g_name] => [{"g_uuid":"***", "g_name":"Габариты"}]
)
[1] => Array
(
[param] => b8490e78-6cf7-4d2f-a759-b7fb1f727fd5
[group_id] => 29fe06d2-db8c-4db5-95a7-36adfe8a71fc
[pv_value] => [{"pv.uuid":"***", "pv_value":"20"}]
[p_name] => [{"p_uuid":"***", "p_name":"Ширина"}]
[g_name] => [{"g_uuid":"***", "g_name":"Габариты"}]
)
[2] => Array
(
[param] => d7477cad-7129-478e-8804-633b9ef1d1d9
[group_id] => 29fe06d2-db8c-4db5-95a7-36adfe8a71fc
[pv_value] => [{"pv.uuid":"***", "pv_value":"30"}]
[p_name] => [{"p_uuid":"***", "p_name":"Длина"}]
[g_name] => [{"g_uuid":"***", "g_name":"Габариты"}]
)
[3] => Array
(
[param] => 2cd7232d-ca41-45f3-b534-faced39d7c4b
[group_id] => 437cb961-f226-4f94-95a2-6771c3b0e7b9
[pv_value] => [{"pv.uuid":"***", "pv_value":"RockShok"}]
[p_name] => [{"p_uuid":"***", "p_name":"Бренд"}]
[g_name] => [{"g_uuid":"***", "g_name":"YandexMarket"}]
)
[4] => Array
(
[param] => 3aba8d76-ab3c-47d5-852a-6a37a9af3172
[group_id] => 437cb961-f226-4f94-95a2-6771c3b0e7b9
[pv_value] => [{"pv.uuid":"***", "pv_value":"Польша"}]
[p_name] => [{"p_uuid":"***", "p_name":"Страна производитель"}]
[g_name] => [{"g_uuid":"***", "g_name":"YandexMarket"}]
)
[5] => Array
(
[param] => cf1a7c88-ea9b-4819-911c-34192f655f73
[group_id] => a42e46d0-3bf2-4dd0-bddc-9547513f1a79
[pv_value] => [{"pv.uuid":"***", "pv_value":"17"}{"pv.uuid":"***", "pv_value":"15"}]
[p_name] => [{"p_uuid":"***", "p_name":"Диагональ"}{"p_uuid":"***", "p_name":"Диагональ"}]
[g_name] => [{"g_uuid":"***", "g_name":"Размеры"}{"g_uuid":"***", "g_name":"Размеры"}]
)
)
Этот результат не устраивает.
Хотелось бы в результате получить такой ответ:
Array
(
[0] => Array
(
[param] => 35d8e1a8-531d-4275-84c3-4b781d1b1f13
[group_id] => 29fe06d2-db8c-4db5-95a7-36adfe8a71fc
[g_name] => [{"g_uuid":"***", "g_name":"Габариты"}]
[p_name] => [{"p_uuid":"***", "p_name":"Высота"},{"p_uuid":"***", "p_name":"Длина"},{"p_uuid":"***", "p_name":"Ширина"}]
[pv_value] => [{"pv.uuid":"***", "pv_value":"10"},{"pv.uuid":"***", "pv_value":"20"},{"pv.uuid":"***", "pv_value":"30"}]
)
[1] => Array
(
[param] => b8490e78-6cf7-4d2f-a759-b7fb1f727fd5
[group_id] => 29fe06d2-db8c-4db5-95a7-36adfe8a71fc
[g_name] => [{"g_uuid":"***", "g_name":"YandexMarket"}]
[p_name] => [{"p_uuid":"***", "p_name":"Страна производитель"},{"p_uuid":"***", "p_name":"Бренд"}]
[pv_value] => [{"pv.uuid":"***", "pv_value":"Польша"},{"pv.uuid":"***", "pv_value":"RockShok"}]
)
[2] => Array
(
[param] => d7477cad-7129-478e-8804-633b9ef1d1d9
[group_id] => 29fe06d2-db8c-4db5-95a7-36adfe8a71fc
[g_name] => [{"g_uuid":"***", "g_name":"Размеры"}]
[p_name] => [{"p_uuid":"***", "p_name":"Диагональ"}]
[pv_value] => [{"pv.uuid":"***", "pv_value":"17"}{"pv.uuid":"***", "pv_value":"15"}]
)
)
Пробовал через LEFT JOIN, вложенные запросы, но всё равно не достиг нужного результата.
Если требуется дам дополнительную информацию.
Как же всё-таки написать правильный запрос?