Ik ben bezig met een 'wizard' om producten te selecteren aan de hand van bepaalde criteria. Elk product heeft bepaalde features, en op die features wil ik een product selecteren. In dit topic pak ik als voorbeeld een TFT monitor, waarvan ik wil dat de schermgrootte minimaal 17'' is en/of de resolutie 1280 x 1024.
Het relevante stuk datamodel ziet er zo uit:

(klik voor grotere versie
In mijn geval ben ik op zoek naar een product uit de product-categorie TFT monitors. Er is nog een product-categorie-tabel, maar die doet hier niet terzake en is niet opgenomen in het schema; ik heb genoeg aan de ID van betreffende categorie, en dat is in dit geval 222.
Elke feature (resolutie, schermgrootte etc) wordt gebruikt in één of meerdere product-categorieen (resolutie is namelijk ook relevant voor bijv. notebooks en PDA's).
De feature_id van resolutie is 80 en van schermgrootte is 15.
Aan een specifiek product (table products) hangen allerlei feature-values (table product_feature) en deze feature-values zijn middels de category_feature tabel weer onder te brengen onder de naam van betreffende feature.
Oftewel, stel ik heb een harddisk (table products), dan hangen hier feature-values aan als '7200rpm' en 'SATA' (table product_feature), en deze zijn dus via table category_feature te koppelen aan de namen van deze features, in dit geval snelheid en interface.
Ik weet niet of ik het zelf zo had opgezet, maar veel kan ik er niet aan veranderen
In ieder geval, ik wil nu dus middels een formulier alle TFT monitors selecteren die een schermgrootte van minimaal 17'' hebben. Dat doe ik met de volgende query:
Hetzelfde kan ik doen met de resolutie:
De bedoeling is dat als iemand straks die twee criteria heeft ingevuld, deze in een SP geramd worden die vervolgens alle TFT monitors teruggeeft die aan deze twee criteria voldoen. Ik heb dit opgelost door in de SP twee temptables aan te maken (eentje voor elk criterium) en vervolgens een join te doen op deze temptables (op idProduct) zodat ik alle TFT's heb die zowel een 17'' grootte hebben als een resolutie van 1280 x 1024.
Tot dusver geen probleem. Echter, het moet ook mogelijk zijn om alle producten te selecteren die aan één van beide criteria voldoen. Op zich is ook dát geen probleem, want dan stop je alles gewoon in één temptable en daar doe je vervolgens een SELECT DISTINCT op.
Het grootste probleem is dat ik naast TFT monitors (waarbij je 2 maar selectie-criteria hebt) ook bijvoorbeeld workstations en notebooks wil kunnen selecteren. En daar praat je over misschien wel 10 criteria, en dat gaat dus qua temptables een beetje uit de klauwen lopen.
En dus? Tsja, ik zoek dus een nette manier om dit probleem te tackelen. Oftewel, hoe bouw ik een SP die een result teruggeeft met producten die aan of alle, of één criteria voldoen, en dan het liefst nog ongeacht het aantal criteria
Het relevante stuk datamodel ziet er zo uit:

(klik voor grotere versie
In mijn geval ben ik op zoek naar een product uit de product-categorie TFT monitors. Er is nog een product-categorie-tabel, maar die doet hier niet terzake en is niet opgenomen in het schema; ik heb genoeg aan de ID van betreffende categorie, en dat is in dit geval 222.
Elke feature (resolutie, schermgrootte etc) wordt gebruikt in één of meerdere product-categorieen (resolutie is namelijk ook relevant voor bijv. notebooks en PDA's).
De feature_id van resolutie is 80 en van schermgrootte is 15.
Aan een specifiek product (table products) hangen allerlei feature-values (table product_feature) en deze feature-values zijn middels de category_feature tabel weer onder te brengen onder de naam van betreffende feature.
Oftewel, stel ik heb een harddisk (table products), dan hangen hier feature-values aan als '7200rpm' en 'SATA' (table product_feature), en deze zijn dus via table category_feature te koppelen aan de namen van deze features, in dit geval snelheid en interface.
Ik weet niet of ik het zelf zo had opgezet, maar veel kan ik er niet aan veranderen
In ieder geval, ik wil nu dus middels een formulier alle TFT monitors selecteren die een schermgrootte van minimaal 17'' hebben. Dat doe ik met de volgende query:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| SELECT products.idProduct,
products.description,
products.price
FROM products
INNER JOIN product_feature
ON product_feature.product_id = products.idProduct
INNER JOIN category_feature
ON product_feature.category_feature_id = category_feature.category_feature_id
INNER JOIN feature
ON category_feature.feature_id = feature.feature_id
WHERE (feature.feature_id = 15) AND
(category_feature.catid = 222) AND
(product_feature.[value] = '17 inch') |
Hetzelfde kan ik doen met de resolutie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| SELECT products.idProduct,
products.description,
products.price
FROM products
INNER JOIN product_feature
ON product_feature.product_id = products.idProduct
INNER JOIN category_feature
ON product_feature.category_feature_id = category_feature.category_feature_id
INNER JOIN feature
ON category_feature.feature_id = feature.feature_id
WHERE (feature.feature_id = 80) AND
(category_feature.catid = 222) AND
(product_feature.[value] = '1280 x 1024') |
De bedoeling is dat als iemand straks die twee criteria heeft ingevuld, deze in een SP geramd worden die vervolgens alle TFT monitors teruggeeft die aan deze twee criteria voldoen. Ik heb dit opgelost door in de SP twee temptables aan te maken (eentje voor elk criterium) en vervolgens een join te doen op deze temptables (op idProduct) zodat ik alle TFT's heb die zowel een 17'' grootte hebben als een resolutie van 1280 x 1024.
Tot dusver geen probleem. Echter, het moet ook mogelijk zijn om alle producten te selecteren die aan één van beide criteria voldoen. Op zich is ook dát geen probleem, want dan stop je alles gewoon in één temptable en daar doe je vervolgens een SELECT DISTINCT op.
Het grootste probleem is dat ik naast TFT monitors (waarbij je 2 maar selectie-criteria hebt) ook bijvoorbeeld workstations en notebooks wil kunnen selecteren. En daar praat je over misschien wel 10 criteria, en dat gaat dus qua temptables een beetje uit de klauwen lopen.
En dus? Tsja, ik zoek dus een nette manier om dit probleem te tackelen. Oftewel, hoe bouw ik een SP die een result teruggeeft met producten die aan of alle, of één criteria voldoen, en dan het liefst nog ongeacht het aantal criteria