Как получить данные из EAV (entity–attribute–value)?

Привет! База: Postgres 13. Структура бд 64f763d4c6b76879179693.png
https://www.db-fiddle.com/f/fXUsP2utgLneDKcASY3zA5/2

Пытаюсь получить данные (в идеале только с атрибутом указанным в условие where)
SELECT
    p.id,
    p.name,
    json_agg(
      json_build_object(
        'id', eav_attr.id,
    	'name', eav_attr.name,
        'text', eav_text.val,
        'real', eav_real.val,
        'boolean', eav_boolean.val
      )
    ) AS characteristics,
    COUNT(*) OVER() AS total
FROM product p
JOIN category c ON c.id = p.category_id
LEFT JOIN eav_entity eav_e ON eav_e.category_id = c.id
LEFT JOIN eav_attribute eav_attr ON eav_attr.id = eav_e.eav_attribute_id
LEFT JOIN eav_val_text eav_text ON eav_text.product_id = p.id
LEFT JOIN eav_val_real eav_real ON eav_real.product_id = p.id
LEFT JOIN eav_val_boolean eav_boolean ON eav_boolean.product_id = p.id
WHERE eav_text.attribute_id = 2
GROUP BY    
  p.id,
  p.name

но получается это characteristics (последнее значение перезаписывает предыдущие значения своего типа)
[
    {
        "id": 1,
        "name": "Описание",
        "text": "свойства продукта",
        "real": 100.2,
        "boolean": null
    },
    {
        "id": 2,
        "name": "Свойства",
        "text": "свойства продукта",
        "real": 100.2,
        "boolean": null
    },
    {
        "id": 3,
        "name": "Цена",
        "text": "свойства продукта",
        "real": 100.2,
        "boolean": null
    }
]

Т.е. в идеале в characteristics хотелось бы получить
[
    {
        "id": 2,
        "name": "Свойства",
        "val": "свойства продукта"
    }
]

ну или хотя бы так
[
    {
        "id": 1,
        "name": "Описание",
        "text": "описание продукта",
        "real": null,
        "boolean": null
    },
    {
        "id": 2,
        "name": "Свойства",
        "text": "свойства продукта",
        "real": null,
        "boolean": null
    },
    {
        "id": 3,
        "name": "Цена",
        "text": null,
        "real": 100.2,
        "boolean": null
    }
]
  • Вопрос задан
  • 115 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы