Таблица "Товары":
id (PRIMARY KEY)
id_категории (FOREIGN KEY)
название
Таблица "Атрибуты товаров":
id (PRIMARY KEY)
id_категории (FOREIGN KEY)
название
Таблица "Значения атрибутов товаров":
id (PRIMARY KEY)
id_товара (FOREIGN KEY)
id_атрибута (FOREIGN KEY)
значение
select
p.name,
group_concat(case when a.name = 'color' then pa.val end) colors
from products p
join products_attributes pa on p.id = pa.product_id
join attributes a on a.id = pa.attribute_id
group by p.id, p.name;
Таблица "Изображение"
ID
Type
Object
Image
SELECT TOP 1 Image
FROM "Изображение" i
LEFT JOIN "Значения атрибутов товаров" v ON i.Type = 'V' AND i.Object = v.ID
WHERE i.Type = 'P' AND i.Object = ?P_ID
AND v.id_товара = ?P_ID AND v.значение = ?V_Color
ORDER BY CASE
WHEN NOT v.ID IS NULL THEN 1
ELSE 2
END