Wat is het doel
We willen voor een webwinkel uitgebreide filtermogelijkheden aanbieden zodat je per 'hoofdfiltergroep' 1 of meerdere selecties kan maken, en als eindresultaat moeten er dan alleen de producten worden getoond die in alle geselecteerde hoofdfiltergroepen voorkomt, en dan per geselecteerde 'subfilters', minimaal 1 van de selecties.
Wat heb je op dit moment
Eén tabel met daarin producten, waarbij ProductId de primaire key is.
Daarnaast heb ik 1 tabel met daarin Productfilters, in een één-level diepe Parent/Child constructie, het tabel bevat 3 kolommen: FilterId, FilterParentId en FilterNaam, als voorbeeld:
Daarnaast heb ik een tabel ProductFilter, met daarin de specificatie per product aan welke childfilter deze gekenmerkt kan worden (er wordt dus altijd een FilterId gegeven uit bovenstaande tabel waarin FilterParentId NOT IS NULL. Het is mogelijk dat 1 product meerdere FilterId's mogen hebben die de zelfde parent hebben. In dit voorbeeld kan 1 product dus zowel Kleur: Wit als Kleur: Zwart als kenmerk hebben.
A.d.h.v. het tabel Productfilters heb ik netjes een checkbox lijstje waaruit je kan filteren. Hierbij zijn de records met NULL als parent dus de 'kolomkoppen' van de onderliggende childs, deze kan dus NIET geselecteerd worden.
Nu is het de bedoeling dat als er geselecteerd wordt: Geheugen: 1Gb - Kleur: Zwart & Wit, dat er een query gemaakt moet worden waaruit in het tabel alle ProductId's worden gehaald waarbij de FilterId = 1Gb (alle producten die dit niet hebben, vervallen), en alles wat daaruit nog overblijft, moet ik weer de ProductId's hebben die ook alleen voorkomen in FilterId = Zwart OR FilterId = Wit.
Wat heb ik zelf al geprobeerd
Uiteraard ben ik hier al behoorlijk mee aan het stoeien, zowel in me hoofd als programmeertechnisch. Echter denk ik dat ik nu even niet de juiste denkvorm heb.
Allereerst heb ik geprobeerd op basis van meerdere subquery's met UNION aan elkaar te reigen, echter is hierbij het probleem dat je een OF/OF query krijgt. Zover ik weet bestaat er geen UNION methode waarbij je uit alle subquery's alleen de Id's krijgt die in ALLE subquery's voorkomen.
Ik heb ook geprobeerd om diversie query's uit te voeren en dan via de code in een array alleen de ProductIds te vinden die in alle subquery's voorkomen, dit is mogelijk maar kost heel veel extra databasebevragingen en denk niet dat dit de juiste manier is.
Wat is nou de beste 'logica' om hiermee om te gaan?
We willen voor een webwinkel uitgebreide filtermogelijkheden aanbieden zodat je per 'hoofdfiltergroep' 1 of meerdere selecties kan maken, en als eindresultaat moeten er dan alleen de producten worden getoond die in alle geselecteerde hoofdfiltergroepen voorkomt, en dan per geselecteerde 'subfilters', minimaal 1 van de selecties.
Wat heb je op dit moment
Eén tabel met daarin producten, waarbij ProductId de primaire key is.
Daarnaast heb ik 1 tabel met daarin Productfilters, in een één-level diepe Parent/Child constructie, het tabel bevat 3 kolommen: FilterId, FilterParentId en FilterNaam, als voorbeeld:
| FilterId | FilterParentId | FilterNaam |
| 1 | NULL | Opslagruimte |
| 2 | 1 | 1Gb |
| 3 | 1 | 4Gb |
| 4 | NULL | Kleur |
| 5 | 3 | Wit |
| 6 | 3 | Zwart |
Daarnaast heb ik een tabel ProductFilter, met daarin de specificatie per product aan welke childfilter deze gekenmerkt kan worden (er wordt dus altijd een FilterId gegeven uit bovenstaande tabel waarin FilterParentId NOT IS NULL. Het is mogelijk dat 1 product meerdere FilterId's mogen hebben die de zelfde parent hebben. In dit voorbeeld kan 1 product dus zowel Kleur: Wit als Kleur: Zwart als kenmerk hebben.
| FilterId | ProductId |
| 2 | 100 |
| 5 | 100 |
| 6 | 100 |
| 2 | 101 |
| 3 | 101 |
| 5 | 101 |
A.d.h.v. het tabel Productfilters heb ik netjes een checkbox lijstje waaruit je kan filteren. Hierbij zijn de records met NULL als parent dus de 'kolomkoppen' van de onderliggende childs, deze kan dus NIET geselecteerd worden.
Nu is het de bedoeling dat als er geselecteerd wordt: Geheugen: 1Gb - Kleur: Zwart & Wit, dat er een query gemaakt moet worden waaruit in het tabel alle ProductId's worden gehaald waarbij de FilterId = 1Gb (alle producten die dit niet hebben, vervallen), en alles wat daaruit nog overblijft, moet ik weer de ProductId's hebben die ook alleen voorkomen in FilterId = Zwart OR FilterId = Wit.
Wat heb ik zelf al geprobeerd
Uiteraard ben ik hier al behoorlijk mee aan het stoeien, zowel in me hoofd als programmeertechnisch. Echter denk ik dat ik nu even niet de juiste denkvorm heb.
Allereerst heb ik geprobeerd op basis van meerdere subquery's met UNION aan elkaar te reigen, echter is hierbij het probleem dat je een OF/OF query krijgt. Zover ik weet bestaat er geen UNION methode waarbij je uit alle subquery's alleen de Id's krijgt die in ALLE subquery's voorkomen.
Ik heb ook geprobeerd om diversie query's uit te voeren en dan via de code in een array alleen de ProductIds te vinden die in alle subquery's voorkomen, dit is mogelijk maar kost heel veel extra databasebevragingen en denk niet dat dit de juiste manier is.
Wat is nou de beste 'logica' om hiermee om te gaan?
Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!