Задать вопрос
slo_nik
@slo_nik

Как правильно сделать выборку из нескольких таблиц?

Добрый вечер.

Есть четре таблицы:
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, вложенные запросы, но всё равно не достиг нужного результата.
Если требуется дам дополнительную информацию.

Как же всё-таки написать правильный запрос?
  • Вопрос задан
  • 45 просмотров
Подписаться 1 Простой 8 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы