Het probleem:
Om bepaalde dingen aan elkaar te koppelen, met bepaalde eisen ben ik tot een aantal tabellen gekomen.In de tabel groups wordt een bepaalde groep gedefineerd, een groep kan een n-aantal producten bevatten die in de tabel groupmembers gedefineerd staan.
Met de tabel groupconnections kan ik achterhalen welke groepen met elkaar in verband staan. Hieronder volgt eerst een algemene beschrijving van de relevante tabellen, daaronder wat voorbeelddata zoals deze in de tabellen kunnen staan.
Tabellen:
Table 'groups'
veldnaam | type | referentie |
---|---|---|
id | int | |
detail | varchar | |
productcategorie | int | refereert naar externe tabel |
Table 'groupmembers'
veldnaam | type | referentie |
---|---|---|
groupsid | int | Refereert naar id in de tabel 'groups' |
prodid | int | refereert naar id in externe tabel |
Table 'groupconnectiontypes'
veldnaam | type | referentie |
---|---|---|
id | int | |
detail | varchar |
Table 'groupconnections'
veldnaam | type | referentie |
---|---|---|
productgroup_koppelproduct | int | refereert naar id in tabel 'groups' |
productgroup_voorwaarde | int | refereert naar id in tabel 'groups' |
connectiontype | int |
Voorbeelddata
SQL:
1
| SELECT * FROM groupconnections g; |
productgroup_koppelproduct | productgroup_voorwaarde | connectiontype |
---|---|---|
1 | 2 | 1 |
3 | 4 | 2 |
3 | 5 | 2 |
6 | 7 | 3 |
SQL:
1
| SELECT * FROM groupmembers g; |
groupsid | prodid |
---|---|
7 | 637 |
4 | 686 |
4 | 688 |
4 | 693 |
5 | 1273 |
5 | 1293 |
5 | 1318 |
6 | 1664 |
1 | 1702 |
1 | 1703 |
1 | 1704 |
2 | 1705 |
2 | 1706 |
2 | 1707 |
3 | 1766 |
Situaties
Als we naar de groupconnections tabel in de eerste row kijken, zien we dat group 1 aan group 2 gekoppeld wordt. Dit betekend dat een product uit group 1 (1702, 1703, 1704) uit een product van group 2 (1705, 1706, 1707) gekoppeld moet worden. Dus: (1702 OR 1703 OR 1704) AND (1705 OR 1706 OR 1707).Dit is ansich nog niet zo'n groot probleem.
Echter, wil ik ook het volgende kunnen, zoals de situatie in de groupconnections tabel, met productgroup_koppelproduct. Hier komt in 2 rijen het productgroup_koppelproduct = 3 voor.. Overe meerdere rijen zouden de resultaten met een AND operator gekoppeld moeten worden dus: group 3 (1766) AND group 4 (686 OR 688 OR 693) AND group 5 (1273 OR 1293 OR 1318).
Waarbij group 3 in de geval 1 product bevat, maar ook een n-aantal had kunnen bevatten.
In de onderstaande sql code staat de connectiontype(=2) die ik refereer nog hardcoded, dit wordt later een parameter.
SQL:
1
2
3
4
5
6
7
8
| SELECT groupsid, prodid FROM groupmembers WHERE groupsid IN( SELECT productgroup_voorwaarde FROM groupconnections WHERE connectiontype = 2 ) ; |
Resultaat:
groupsid | prodid |
---|---|
4 | 686 |
4 | 688 |
4 | 693 |
5 | 1273 |
5 | 1293 |
5 | 1318 |
Wat wil ik nou uiteindelijk
Connectiontype als parameter meegeven, en een n-aantal parameters.Als ik connectiontype = 2 heb, wil ik dus (OR op alle producten uit group=3) AND (OR op alle producten uit group=4) AND (OR op alle producten uit group=5).
In het geval van connectype = 1, wil ik dus (OR op alle producten uit group=1) AND (OR op alle producten uit group=2)
Hoevaak er dus een AND op een aantal producten moet gedaan worden hangt af van de tabel groupconnections.
Het liefste zou ik als parameter in mijn sql willen meegeven welke connectiontype het is, en een n-aantal productid's. Connectiontype = 2, products(1766, 688, 1293) dit zou een true moeten retourneren. Want 1766 IN (group3) = true, AND 688 IN(group4) = true, AND 1293 IN(group5) = true.
In het geval van: Connectiontype = 2, products(1766, 555, 1293) wil ik false terug krijgen. Want 1766 IN (group3) = true, AND 555 IN(group4) = false, AND 1293 IN(group5) = true.
Hopelijk kan iemand mij in de juiste richting duwen, eigenlijk wil ik dus een soort van foreach lus in sql voor elkaar krijgen. Ik zit gewoon even compleet vast in mijn gedachten gang hierover. Alvast bedankt voor alle hulp en duwtjes in de juiste richting.
Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?