i en uselt byggd databas så har jag en tabell där alla produkter ligger. Problemet är att många av dem är endast varianter på varandra, tex olika storlekar.
nu tänkte jag mig då att lite snyggt flytta ut den gemensamma infon till en egen tabell och sen länka ihop alltsammans igen.
tabellen har bland annat fälten
VendorID
Title
ProduktTypID
Genom dessa borde man kunna identifiera produkter som hör samman med varandra. Frågan är hur en vettig SQL-sats för det skall se ut.
Dvs nuvarande data kan se ut såhär
VendorID Title ProdTypeID Storlek
1 yadayadda 1 L
1 yadayadda 1 M
1 yadayadda 1 S
1 hoppsan 1 One-size
och jag vill få ut
VendorID Title ProdTypeID
1 yadayadda 1
1 hoppsan 1
Min tanke är nån variant med "group by" och sen köra en Insert-Select för att skapa tabellen med "huvudprodukter" och sen göra nån omvänd procedur för att hitta huvudprodukternas underprodukter
nuvarande tabellen med produkter får inte förändras, dvs inte skapas om, eftersom all gammal orderhistorik, säljstatistik mm är innehåller referenser till dess primärnyckel
Så, visa vad ni går för och kom med smarta tips :birp
Det du vill göra kan bli svårt att göra enbart med SQL. Men om vi gör ett försök:
Det första du vill göra är att plocka ut alla storlekar till en egen tabell:
create table `sizes` (
`id` int unsigned not null auto_increment,
`size` varchar(25) not null,
primary key(`id`)
);
insert into
`sizes` (size)
select
distinct(`Storlek`)
from
`your_product_table`
Sen vill du hämta alla produkter och lägga i en ny tabell.
insert into
`your_new_table` (ProductID, VendorID, Title, ProdTypeID)
select
`ProductID`,
`VendorId`,
`Title`,
`ProdTypeID`
from
`your_old_table`
group by
`ProductID`
Sen börjar problemen. Nu vill du skapa en tabell som hanterar relationen mellan produkten och storleken.
create table `product_sizes` (
`productId` int unsigned not null,
`sizeId` int unsigned not null,
primary key(`productId`, `sizeId`)
);
Nu ska alltså alla produkt-id:n och storleks-id:n in i den tabellen. Ett försök (from the top of my head):
insert into
`product_sizes` (productId, sizeId)
select
a.`ProductID` as productId,
b.`id` as sizeId
from
`your_old_table` as old,
`your_new_table` as a,
`sizes` as b
where
b.`size`=old.`Storlek`
and
a.`ProductID`=old.`ProductID`
Inte testat, men något liknande skulle jag gissa på att du behöver.
Är det bara för mig som SPiNs svar ser lite trunkerat ut? Adde2s kommentar tyder på att han ser/såg en annan version av inlägget.
Nä det ser trukerat ut för mig med, Spins svar var dock med i mailet som kom när han svarade på tråden.
Han svar såg ut så här:
Det du vill göra kan bli svårt att göra enbart med SQL. Men om vi gör ett försök:
Det första du vill göra är att plocka ut alla storlekar till en egen tabell:
Code:
---------
create table `sizes` (
`id` int unsigned not null auto_increment,
`size` varchar(25) not null,
primary key(`id`)
);
insert into
`sizes` (size)
select
distinct(`Storlek`)
from
`your_product_table`
---------
Sen vill du hämta alla produkter och lägga i en ny tabell.
Code:
---------
insert into
`your_new_table` (ProductID, VendorID, Title, ProdTypeID)
select
`ProductID`,
`VendorId`,
`Title`,
`ProdTypeID`
from
`your_old_table`
group by
`Title`
---------
Sen börjar problemen. Nu vill du skapa en tabell som hanterar relationen mellan produkten och storleken.
Code:
---------
create table `product_sizes` (
`productId` int unsigned not null,
`sizeId` int unsigned not null,
primary key(`productId`, `sizeId`)
);
---------
Nu ska alltså alla produkt-id:n och storleks-id:n in i den tabellen. Ett försök (from the top of my head):
Code:
---------
insert into
`product_sizes` (productId, sizeId)
select
a.`ProductID` as productId,
b.`id` as sizeId
from
`your_old_table` as old,
`your_new_table` as a,
`sizes` as b
where
b.`size`=old.`Storlek`
and
a.`ProductID`=old.`ProductID`
---------
Inte testat, men något liknande skulle jag gissa på att du behöver.
***************
Jag gjorde en editering av något (minns inte vad just nu), som tog väääldigt lång tid på sig att slutföra requesten. Men efter det gått igenom så såg allt rätt ut. Märkligt!
Spins lösning är ju ungefär det jag vill åstadkomma.
Grundproblemet återstår dock. dvs hur får jag ut "unika" produkter
det funkar inte att enbart gruppera på titel, eftersom samma "tillverkare" kan ha flera produkter med samma titel, fast olika produkttyp
tex
VendorID Title Prodtype (egentligen ID)
1 SomeTitle Tshirt
1 SomeTitle Longsleeve
1 SomeTitle CD
kan "Group By VendorID,Title, ProdTypeID" funka?
jag kommer inte behöva skapa någon "kopplingstabell" mellan produkt och storlek, eftersom den tabellen redan finns, dvs den nuvarande produkt-tabellen (som måste finnas kvar eftersom jag inte har lust att ändra produktID:n i varenda order sen 2007