webForumDet fria alternativet

få ut unika ur produkt-tabell

Databaser & SQL

13 svar · 780 visningar · startad av rhdf

Medlem sedan okt. 2007446 inlägg
Frågan#1

Gokväll
Jag sitter med ett lite delikat problem.

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

Medlem sedan juni 2009920 inlägg
#2
Select first(VendorID), first(title), first(ProdTypeID) from tabell group by Title
Medlem sedan okt. 2007446 inlägg
#3

nopp first verkade inte funka alls,...

Medlem sedan juni 2009920 inlägg
#4

Vad kör du för databas? Tror bara att "first" funkar för MySql

Medlem sedan maj 2000144 inlägg
#5

fel.

Medlem sedan mars 20007 896 inlägg
#6

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.

Medlem sedan mars 20025 907 inlägg
#7

Ä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.

trunkerat.png
Medlem sedan maj 2000144 inlägg
#8

Peeer skrev:

Ä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.
***************

Medlem sedan mars 20007 896 inlägg
#9

Det var spännande :)

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!

Har återskapat inlägget.

Medlem sedan okt. 2007446 inlägg
#10

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

Medlem sedan mars 20007 896 inlägg
#11

Nu minns jag att det var min ändring! Jag ändrade grupperingen till ProductID, för det fältet fanns väl?

Men för att svara på frågan, ja - du kan gruppera på fler fält än ett (1).

Medlem sedan maj 2000144 inlägg
#12

SPiN skrev:

Nu minns jag att det var min ändring! Jag ändrade grupperingen till ProductID, för det fältet fanns väl?

Men för att svara på frågan, ja - du kan gruppera på fler fält än ett (1).

fast eftersom att du inte använder någon aggregatfunktion så kanske det snyggare att använda distinct istället.

Medlem sedan okt. 2007446 inlägg
#13

ProductID finns, det är primärnyckeln i nuvarande tabellen ;)
Så den har man ingen större nytta av att gruppera på ;)

Medlem sedan maj 2000144 inlägg
#14

Funkar i SQLServer 2008.

create table gamla_tabellen
(
	vendorid int,
	title varchar(25),
	prodtypeid int,
	storlek varchar(25)
);

insert into gamla_tabellen values (1, 'yadayadda', 1, 'L');
insert into gamla_tabellen values (1, 'yadayadda', 1, 'M');
insert into gamla_tabellen values (1, 'yadayadda', 1, 'S');
insert into gamla_tabellen values (1, 'hoppsan', 1, 'One-size');

create table nya_tabellen
(
	prodid int identity,
	vendorid int,
	title varchar(25),
	prodtypeid int
);

create table storlek
(
	storleksid int identity,
	storlek varchar(25)
);

create table linktabell
(
	prodid int,
	storleksid int
);

insert  into nya_tabellen (vendorid , title, prodtypeid)
select distinct vendorid , title, prodtypeid
from gamla_tabellen;

insert into storlek (storlek)
select distinct storlek from gamla_tabellen;

insert into linktabell (prodid, storleksid)
select distinct n.prodid, s.storleksid
from nya_tabellen n
inner join gamla_tabellen g on n.vendorid = g.vendorid and n.prodtypeid = g.prodtypeid and n.title = g.title
inner join storlek s on g.storlek = s.storlek;

select * from nya_tabellen n
inner join linktabell l on n.prodid = l.prodid
inner join storlek s on l.storleksid = s.storleksid

sen ska du givetvis lägga till primärnycklar, index och foreign keys... etc...

273 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)