Digamos que tengo una tabla de Product
, Category
y Product_To_Category
. Un producto puede estar en múltiples categorías.SQL para unir una tabla a otra tabla varias veces? (Asignación de productos a categorías)
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
me gustaría una consulta SQL que me da un resultado como
ProductName | Category_1 | Category_2 | Category_3 ======================================================= Rose | Flowers | | Chocolate Flower | Flowers | Food |
etc.
La mejor manera que he sido capaz de conseguir esto es la unión de un grupo de consultas juntas; una consulta para cada cantidad esperada de categorías para un producto determinado.
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)
Existen varios problemas con esto.
- Primero, tengo que repetir esta unión para cada categoría esperada; si un producto puede estar en 8 categorías necesitaría 8 consultas.
- En segundo lugar, las categorías no se colocan uniformemente en las mismas columnas. Por ejemplo, a veces un producto puede tener "Comida, flores" y otro tiempo "Flores, comida".
¿Alguien sabe de una mejor manera de hacer esto? Además, ¿esta técnica tiene un nombre técnico?
Creo que también necesita agregar GROUP BY, ¿verdad? – meleyal
¡Absolutamente! Olvidado sobre eso, gracias! – Seb
Sin GROUP BY esta consulta solo devolverá una fila, del mismo modo que una consulta COUNT (*) solo devolverá una fila. – chim