Hoofdcategorieën
Topicacties

[SQL] producten ophalen die combineren uit een zelfde tabel

Pagina: 1

Reageer Nieuw Topic
chocolate addicted

Ik zit met het volgende probleem. ik heb 1 product, dit product bestaat uit een bundel van 2 producten. deze 2 producten kunnen ook apart van elkaar besteld worden.

elk product heeft een eigen naam, code, prijs, omschrijving en koppeling met andere producten als het een bundel is.
quote:
CREATE TABLE `product` (
`product_id` int(4) NOT NULL auto_increment,
`productcode` varchar(10) NOT NULL,
`product_bundel_1` varchar(10) default NULL,
`product_bundel_2` varchar(10) default NULL,
`naam` varchar(100) NOT NULL,
`omschrijving` text,
`afbeelding` varchar(100) default NULL,
`prijs` int(10) NOT NULL,
PRIMARY KEY (`product_id`)
)
voorbeeld:
* product 'vpg' = 10,-
* product 'vps' = 20,-
* product 'vpe' bestaat uit product 'vpg' en vps' en kost 27,-
* product 'vpe' heeft omdat het een bundel is korting

dus voor product vpe staat bij product_bundel_1 'vpg' en product_bundel_2 'vps'
het is niet mogelijk om een 3de product aan de bundel te combineren, dit zal later ook niet gebeuren.

Mijn probleem
in 1 tabel kan je niet select * from product where product_bundel_1 = productcode

Ideetjes
* nu zit ik aan een select in een select te denken maar ik twijfel of dat werkt. waar ik ook aan zit te denken is een koppeltabel waar die die bundel productcodes in staan.

* in een sessie bijhouden of het een bundel is zodat ik dan uit verschillende tabellen kan kiezen en sql statements dus.

kortom ik zit een beetje vast heeft iemand ideeen hoe dit op te lossen is?

ReseTTim wijzigde dit bericht 24-07-2008 17:04 (3%)

free pr0n Compaq = Computers often make people quite angry!
Nikon D50 + 18-70mm f3.5-4.5G + 70-210mm f4.0 + lensbaby 2.0 + SB-600 & Sony HC40 DVcam

Zou je die bundels en de informatie daarover (kortingspercentage oid) niet gewoon in een aparte tabel kwijt kunnen? Stel, je hebt straks een bundel uit drie producten, wat dan? edit: daar dacht je zelf al aan, lijkt mij een logische keuze :)

neographikal wijzigde dit bericht 24-07-2008 17:02 (25%)

chocolate addicted

quote:
neographikal schreef op donderdag 24 juli 2008 @ 16:59:
Zou je die bundels en de informatie daarover (kortingspercentage oid) niet gewoon in een aparte tabel kwijt kunnen? Stel, je hebt straks een bundel uit drie producten, wat dan? edit: daar dacht je zelf al aan, lijkt mij een logische keuze :)
bundel kan uit max 2 producten bestaan en dit zal later ook niet gewijzigd worden..

free pr0n Compaq = Computers often make people quite angry!
Nikon D50 + 18-70mm f3.5-4.5G + 70-210mm f4.0 + lensbaby 2.0 + SB-600 & Sony HC40 DVcam

Berichten: 457
Reg. datum: 15 januari 2008

Je kan dingen doen als SELECT * FROM product AS p1, product AS p2 WHERE p1.[...]=p2.[...]

Maar ik zou eerder denken aan een ander datamodel. product_bundel_1 en product_bundel_2 lijken mij onhandig. Maak gewoon een extra tabel als GebundeldProduct(product_id,product_in_bundel). Kun je ook gelijk bundels van meer dan 2 producten maken, en hoef je niet dingen met 'or' te doen.
 
Dan nog is voor m'n gevoel een bundel een zelfstandig iets waar informatie aan kan hangen (kortingspercentage, omschrijving, etc etc) die niet thuishoort bij het product zelf. Het geeft je ook een stuk flexibiliteit (toch bundel uit meer producten, product in meer dan twee bundels, etc) :)
Als je dit ziet in een database:
code:
1
2
`product_bundel_1` varchar(10) default NULL,
`product_bundel_2` varchar(10) default NULL,

Dan moet er meteen in je hoofd een belletje gaan rinkelen dat er iets niet klopt. Wat als je een aanbieding met 3 producten wil maken? Normaliseren is de key hier.
quote:
bundel kan uit max 2 producten bestaan en dit zal later ook niet gewijzigd worden..
Zeg nooit nooit. Hoe vaak ik al van opdrachtgevers heb gehoord "dit veranderd nooit" en "dit staat vast". :X

sig69 wijzigde dit bericht 24-07-2008 17:12 (25%)

Witlof ^^

quote:
... denken is een koppeltabel waar die die bundel productcodes in staan.
Thats the way to go, zo kun je dus een ontelbaar aantal producten aan elkaar koppelen en heb je niet bij elk artikel 2 velden die voor 95% van de artikelen toch niet gebruikt worden.

Denk aan een tabel met :
code:
1
2
3
ID
bundleID
productID

en dan kun je eventueel nog een tabel met bundleID's maken waarin je de korting en eventueel andere dingen specificeert

... MMORPG Addict.

Berichten: 685
Reg. datum: 05 oktober 2002

quote:
CRiMiNaL schreef op donderdag 24 juli 2008 @ 17:15:
Denk aan een tabel met :
code:
1
2
3
ID
bundleID
productID

Waar dient de kolom ID voor in deze? Volgens mij is die overbodig.

@TS:

Je hebt een product, een bundel en een bundel van producten. Eigenlijk hoef je de syntax van SQL niet te begrijpen om aan te voelen dat 3 tabellen het meest logisch is. :)

AlainS wijzigde dit bericht 24-07-2008 22:08 (27%)

Witlof ^^

quote:
AlainS schreef op donderdag 24 juli 2008 @ 22:06:
[...]


Waar dient de kolom ID voor in deze? Volgens mij is die overbodig.
Ja eigenlijk is hij overbodig, maar ik hou ervan om altijd 1 unieke identifier in m'n tabellen te hebben aangezien de andere 2 deze eigenschap niet hebben.

... MMORPG Addict.

Berichten: 3.944
Reg. datum: 28 april 2000

Ik zou ook aantal in de tabel opnemen, mischien wil je wel een bundel waar 2 maal hetzelfde product in zit. Je zou dan ook een extra record toe kunnen voegen, maar een aantal veld lijkt me duidelijker

To be, or not to be, those are the parameters

chocolate addicted

quote:
CRiMiNaL schreef op donderdag 24 juli 2008 @ 17:15:
Thats the way to go, zo kun je dus een ontelbaar aantal producten aan elkaar koppelen en heb je niet bij elk artikel 2 velden die voor 95% van de artikelen toch niet gebruikt worden.

Denk aan een tabel met :
code:
1
2
3
ID
bundleID
productID

en dan kun je eventueel nog een tabel met bundleID's maken waarin je de korting en eventueel andere dingen specificeert
ik heb nu zo'n koppeltabel gemaakt met de volgende sql code
SQL:
1
2
3
4
SELECT *
FROM product pbundel b
WHERE productcode = productcode_fk
AND bundelid = 'vpe'

en dan ga ik eerst dmv sql opdracht kijken of productcode voorkomt in bundelid zo nee dan is het geen bundel en dan is het een simpele sql opdracht

of heeft iemand een mooiere oplossing?

free pr0n Compaq = Computers often make people quite angry!
Nikon D50 + 18-70mm f3.5-4.5G + 70-210mm f4.0 + lensbaby 2.0 + SB-600 & Sony HC40 DVcam

Berichten: 457
Reg. datum: 15 januari 2008

quote:
ReseTTim schreef op vrijdag 25 juli 2008 @ 11:25:
of heeft iemand een mooiere oplossing?
Wat ideeen:
  • Gebruik nooit "select *", maar specificeer wat je wilt
  • "a inner join b on a.x=b.y" ipv "a,b where a.x=b.y" is duidelijker
  • bundelid zou ik een int maken en een foreign key naar product_id laten zijn
  • Je kan dingen doen als
    SQL:
    1
    2
    SELECT EXISTS(SELECT * FROM bundel WHERE bundel_id=p.product_idis_bundel
    FROM product p

    Maar bij het tonen van een product zie je snel genoeg of je een lege resultset terugkrijgt.
 
chocolate addicted

quote:
pedorus schreef op vrijdag 25 juli 2008 @ 12:14:
Wat ideeen:
  • Gebruik nooit "select *", maar specificeer wat je wilt
  • "a inner join b on a.x=b.y" ipv "a,b where a.x=b.y" is duidelijker
  • bundelid zou ik een int maken en een foreign key naar product_id laten zijn
  • Je kan dingen doen als
    SQL:
    1
    2
    SELECT EXISTS(SELECT * FROM bundel WHERE bundel_id=p.product_idis_bundel
    FROM product p

    Maar bij het tonen van een product zie je snel genoeg of je een lege resultset terugkrijgt.
je hebt gelijk betreft die join, die moet ik verbeteren.
quote:
CREATE TABLE `bundel` (
`bundelid` varchar(10) NOT NULL,
`productcode_fk` varchar(10) NOT NULL,
PRIMARY KEY (`bundelid`,`productcode_fk`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
zo heb ik het opgebouwd gezien productcode bestaat uit unieke tekenreeks. hierdoor hoeft de foreign key geen Id nummer te zijn. daarnaast is het makkelijk van doorgeven van de code.

free pr0n Compaq = Computers often make people quite angry!
Nikon D50 + 18-70mm f3.5-4.5G + 70-210mm f4.0 + lensbaby 2.0 + SB-600 & Sony HC40 DVcam

Berichten: 21
Reg. datum: 03 maart 2006

Classic Bill-of-Material (BOM) problem - google is your friend
 

Pagina: 1



VNU Media logo Powered by True

© 1998 - 2008 Tweakers.net - Alle rechten voorbehouden

Uitgever van: