Załóżmy, że mam tabelę Product
, Category
i Product_To_Category
. Produkt może być w wielu kategoriach.SQL, aby wielokrotnie połączyć jedną tabelę z inną tabelą? (Mapowanie produktów do kategorii)
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
Chciałbym zapytanie SQL, które daje mi wynik taki jak
ProductName | Category_1 | Category_2 | Category_3 ======================================================= Rose | Flowers | | Chocolate Flower | Flowers | Food |
itp
Najlepszym sposobem udało mi się dostać to do unii grono zapytania wspólnie; jedno zapytanie dla każdej spodziewanej liczby kategorii dla danego produktu.
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)
Jest kilka problemów z tym.
- Najpierw muszę powtórzyć ten związek dla każdej oczekiwanej kategorii; jeśli produkt może być w 8 kategoriach, potrzebuję 8 zapytań.
- Po drugie, kategorie nie są równomiernie umieszczane w tych samych kolumnach. Na przykład czasami produkt może mieć "Jedzenie, kwiaty", a innym razem "Kwiaty, jedzenie".
Czy ktoś wie o lepszy sposób to zrobić? Czy ta technika ma również nazwę techniczną?
Myślę, że musisz również dodać GROUP BY, prawda? – meleyal
Absolutnie! Zapomniałem o tym, dzięki! – Seb
Bez grupy GROUP PRZEZ to zapytanie zwróci tylko jeden wiersz, w taki sam sposób, w jaki zapytanie COUNT (*) zwróci tylko jeden wiersz. – chim