SQL para associar uma tabela a outra tabela várias vezes? (Mapeando produtos para categorias)
Digamos que eu tenho umProduct
, Category
eProduct_To_Category
mesa. Um produto pode estar em várias categorias.
Product Category Product_to_category ID | NAME ID | Name Prod_id | Cat_id ===================== ============ =================== 1| Rose 1| Flowers 1| 1 2| Chocolate Bar 2| Food 2| 2 3| Chocolate Flower 3| 1 3| 2
Gostaria de uma consulta SQL que me dê um resultado como
ProductName | Category_1 | Category_2 | Category_3 ======================================================= Rose | Flowers | | Chocolate Flower | Flowers | Food |
etc.
A melhor maneira de conseguir isso é unir um monte de consultas; uma consulta para cada número esperado de categorias para um determinado produto.
select p.name, cat1.name, cat2.name
from
product p,
(select * from category c, producttocategory pc where pc.category_id = c.id) cat1,
(select * from category c, producttocategory pc where pc.category_id = c.id) cat2
where p.id = cat1.id
and p.id = cat2.id
and cat1.id != cat2.id
union all
select p.name, cat1.name, null
from
product p,
(select * from category c, producttocategory pc where pc.category_id = c.id) cat1
where p.id = cat1.id
and not exists (select 1 from producttocategory pc where pc.product_id = p.id and pc.category_id != cat1.id)
Existem vários problemas com iss
Primeiro, tenho que repetir essa união para cada categoria esperada; se um produto puder estar em 8 categorias, eu precisaria de 8 consultas. Segundo, as categorias não são uniformemente colocadas nas mesmas colunas. Por exemplo, às vezes um produto pode ter 'Comida, flores' e outra vez 'Flores, comida'.Alguém sabe de uma maneira melhor de fazer isso? Além disso, essa técnica tem um nome técnico?