Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[SQL] producten ophalen die combineren uit een zelfde tabel

Pagina: 1
Acties:

  • ReseTTim
  • Registratie: Juni 2000
  • Laatst online: 08-11 23:07

ReseTTim

Chocolate addicted

Topicstarter
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: sql tabel
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?

[ Voor 3% gewijzigd door ReseTTim op 24-07-2008 17:04 ]

Mijn profiel - Te koop: Overzicht van spullen..


Verwijderd

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 :)

[ Voor 25% gewijzigd door Verwijderd op 24-07-2008 17:02 ]


  • ReseTTim
  • Registratie: Juni 2000
  • Laatst online: 08-11 23:07

ReseTTim

Chocolate addicted

Topicstarter
Verwijderd 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..

Mijn profiel - Te koop: Overzicht van spullen..


  • pedorus
  • Registratie: Januari 2008
  • Niet online
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.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Verwijderd

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) :)

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 00:42
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.
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

[ Voor 25% gewijzigd door sig69 op 24-07-2008 17:12 ]

Roomba E5 te koop


  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024

CRiMiNaL

Witlof ^^

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


  • Alain
  • Registratie: Oktober 2002
  • Niet online
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. :)

[ Voor 27% gewijzigd door Alain op 24-07-2008 22:08 ]

You don't have to be crazy to do this job, but it helps ....


  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024

CRiMiNaL

Witlof ^^

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.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
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

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • ReseTTim
  • Registratie: Juni 2000
  • Laatst online: 08-11 23:07

ReseTTim

Chocolate addicted

Topicstarter
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 p, bundel 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?

Mijn profiel - Te koop: Overzicht van spullen..


  • pedorus
  • Registratie: Januari 2008
  • Niet online
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_id) is_bundel
    FROM product p

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

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • ReseTTim
  • Registratie: Juni 2000
  • Laatst online: 08-11 23:07

ReseTTim

Chocolate addicted

Topicstarter
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_id) is_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: sql tabel
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.

Mijn profiel - Te koop: Overzicht van spullen..


  • The Van
  • Registratie: Maart 2006
  • Laatst online: 09-02-2023
Classic Bill-of-Material (BOM) problem - google is your friend
Pagina: 1