Disons que j'ai un Product
, Category
, et Product_To_Category
tableau. Un produit peut être dans plusieurs catégories.SQL pour joindre une table à une autre table plusieurs fois? (Mappage des produits aux catégories)
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
Je voudrais une requête SQL qui me donne un résultat tel que
ProductName | Category_1 | Category_2 | Category_3 ======================================================= Rose | Flowers | | Chocolate Flower | Flowers | Food |
etc.
La meilleure façon que je suis en mesure d'obtenir est d'union un groupe de requêtes ensemble; une requête pour chaque nombre attendu de catégories pour un produit donné.
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)
Il y a plusieurs problèmes avec ceci.
- D'abord, je dois répéter cette union pour chaque catégorie attendue; Si un produit peut être dans 8 catégories, j'ai besoin de 8 requêtes. Deuxièmement, les catégories ne sont pas uniformément placées dans les mêmes colonnes. Par exemple, un produit peut parfois avoir «Nourriture, Fleurs» et une autre fois «Fleurs, Nourriture».
Quelqu'un sait-il d'une meilleure façon de le faire? Aussi, cette technique a-t-elle un nom technique?
Je pense que vous devez également ajouter GROUP BY, non? – meleyal
Absolument! J'ai oublié ça, merci! – Seb
Sans le GROUP BY cette requête ne retournera qu'une ligne, de la même manière qu'une requête COUNT (*) ne retournera qu'une seule ligne. – chim